我想在我的代码中实现一个hashmap,所以我决定坚持murmurhash3
我目前只提供为x86编译的程序,并试图保持代码的通用性,所以我从未遇到过在x64上运行程序的麻烦。
现在我查看了murmurhash的头文件,该库提供了以下功能:
MurmurHash3_x86_32
MurmurHash3_x86_64
MurmurHash3_x86_128
MurmurHash3_x64_32
MurmurHash3_x64_64
MurmurHash3_x64_128
这是否意味着我必须使用x64函数并提供x64可执行文件才能在x64系统上使用此哈希库?或者我可以简单地使用x86版本,只是遇到较差的性能?
我认为_32 _64 _128位版本只是意味着更多位版本可以提供更好的分发吗?
答案 0 :(得分:5)
编辑:查看murmurhash3 documentation后更改了所有内容。
首先,_x86变体是可移植的哈希算法。 _32 / _64 / _128以位为单位表示散列的宽度。通常_32应该没问题,只要你的哈希算法小于2 32 桶。
_x64变体是哈希算法的完全不同的系列。所有_x64变体都基于_x64_128
实现 - 一个128位散列。然后,他们扔掉部分哈希值以获得_32和_64位大小。这可能会或可能不会比_x86更快 - 文档声称有一些令人印象深刻的加速。但请注意,它很可能获得与x86变体不同的哈希值。
答案 1 :(得分:-1)
x86 表示该算法针对32位平台进行了优化。这意味着它在32位无符号整数上运行。
x64 然后针对64位平台进行了优化,运行在64位无符号整数上。
此外,两者之间的结果不兼容。相同输入的哈希值将有所不同,具体取决于它是MurmurHash3_x86_128
还是MurmurHash3_x64_128
。
这是否意味着我必须使用x64函数并提供x64可执行文件才能在x64系统上使用此哈希库?或者我可以简单地使用x86版本,只是遇到较差的性能?
可以为32位系统编译64位散列函数,但由于编译器将计算分为两部分,因此最终会很慢。如果32位支持很重要,则应使用x86优化函数,而不是x64优化函数。在x64系统上,32位代码运行正常,但我认为这是一个利用不足的问题。在64位CPU上,x64优化算法效率更高。
我认为_32 _64 _128位版本只是意味着更多位版本可以提供更好的分发吗?
我认为答案是是。如果通过分配你的意思是“不太可能导致碰撞”。散列中使用的每个额外内存位都会显着增加可能结果的数量。 4位哈希有16个可能的哈希值,而64个提供18个quintillion(128然后提供340.2十亿个!)。 256位提供了足够的数据,通常足以用于加密安全目的。
其他需要注意的事项:最近,现代散列函数利用新的CPU指令集,如CRC32,AES,SSE2,SIMD - 其中该函数利用特定的CPU功能/指令在受支持的硬件下实现更好的性能。这可以大大加快支持这些现代功能的CPU上的散列。