我有 64 位机器,由于它的速度( https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cppMurmurHash3_x64_128
中的函数) ,我想使用 128 位 murmurhash3 。
但问题是我对这个哈希函数的输入不会超过 30 个字节长,在这种情况下for
,该函数中的循环MurmurHash3_x64_128
只会迭代一次,然后尾部部分就会完成。在这样的方案中,似乎混合不会那么好。我对吗?如果不是,您能否详细说明原因?如果是的话,你会建议128位murmurhash3的输入密钥的合理最小长度是多少,这样散列是好的?
第二件事是关于输出位的截断。据我从答案https://stackoverflow.com/a/11488383/7056851中了解到,虽然由于输出范围较小会导致更高的冲突率,但如果原始哈希函数为“随机”足够了。那么我的问题是 128 位 murmurhash3 是否是输出截断的良好候选者。我问这个的原因是我想使用MurmurHash3_x64_128
它的速度性能,但我只需要 32 位哈希值,所以我计划将 128 位分离为 32 位,并为给定的获取 4 个 32 位哈希值钥匙。但我怀疑得到的哈希值有多好。
最后一个问题是关于字节序的。如果您查看源代码链接中第 52 行的注释,它会说:
块读取 - 如果您的平台需要进行字节序交换或只能处理对齐读取,请在此处进行转换
为什么平台是小端还是大端很重要?毕竟,所有的位都与一些常数相乘、旋转和异或等,而我们想要从哈希函数中得到的基本上是将输入键映射到输出范围,并均匀分布。字节序如何改变图片?即使它改变了图片,如果输入是一个char数组怎么办?至少对于字符数组之类的键来说,字节序不应该是重要的,不是吗?
如您所见,我不太擅长分析哈希函数。任何明确的解释表示赞赏。