C++ 在密钥长度较小或输出截断的情况下,128位HASH3的质量如何变化?

C++ 在密钥长度较小或输出截断的情况下,128位HASH3的质量如何变化?,c++,hash,endianness,truncation,murmurhash,C++,Hash,Endianness,Truncation,Murmurhash,我有64位的机器,我想使用128位的MurrueHash3,因为它的速度很快(MurrueHash3\u x64\u 128function in) 但问题是,我对这个散列函数的输入长度不会超过30字节,在这种情况下,该函数中的for循环将只迭代一次,然后完成尾部部分。在这样一个方案中,混合似乎不会那么好。我说得对吗?如果没有,请详细说明原因?如果是,您会建议输入密钥的合理最小长度为128位HASH3,这样哈希就好了 第二件事是关于输出位的截断。据我从答案中了解,虽然由于输出范围较小而导致更高的

我有64位的机器,我想使用128位的MurrueHash3,因为它的速度很快(
MurrueHash3\u x64\u 128
function in)

但问题是,我对这个散列函数的输入长度不会超过30字节,在这种情况下,该函数中的
for
循环将只迭代一次,然后完成尾部部分。在这样一个方案中,混合似乎不会那么好。我说得对吗?如果没有,请详细说明原因?如果是,您会建议输入密钥的合理最小长度为128位HASH3,这样哈希就好了

第二件事是关于输出位的截断。据我从答案中了解,虽然由于输出范围较小而导致更高的冲突率,但如果原始散列函数足够“随机”,则对输出进行切片仍然会提供良好的散列值。我的问题是,128位hash3是否适合进行输出截断。我问这个问题的原因是,我想使用
杂音hash3_x64_128
来提高其速度性能,但我只需要32位哈希值,因此我计划将128位分隔为32位,并为给定的密钥获取4个32位哈希值。但我怀疑得到的散列值有多好

最后一个问题是关于endianness。如果您查看源代码链接中第52行的注释,它会说:

块读取-如果您的平台需要进行endian交换或只能处理对齐读取,请在此处进行转换

为什么平台是小端还是大端很重要?毕竟,所有的位都与一些常数相乘,并旋转和XORed,等等。我们想要从散列函数中得到的基本是将输入键映射到输出范围,以均匀分布。endianness是如何改变画面的?即使它改变了图片,如果输入是一个字符数组呢?endianness至少对字符数组这样的键来说应该不重要,对吗

如您所见,我不太擅长分析哈希函数。任何清楚的解释都将不胜感激