x86或x64上的散列之间的差异

时间:2011-02-19 10:40:09

标签: c++ hash murmurhash

我想在我的代码中实现一个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位版本只是意味着更多位版本可以提供更好的分发吗?

2 个答案:

答案 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上的散列。

相关问题