3

我想在我的代码中实现一个哈希图,所以我决定坚持使用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 位版本仅意味着更多位版本提供更好的分布是否正确?

4

2 回答 2

6

编辑:查看murmurhash3 文档后更改了所有内容。

首先,_x86 变体是可移植的哈希算法。_32/_64/_128 表示散列的宽度(以位为单位)。通常 _32 应该没问题,只要您的哈希算法小于 2 32 个桶。

_x64 变体是一个完全不同的哈希算法家族。所有 _x64 变体都基于_x64_128实现 - 128 位哈希。然后他们丢弃部分哈希以获得 _32 和 _64 位大小。这可能会也可能不会比 _x86 变体更快——尽管文档声称有一些令人印象深刻的加速。但是请注意,它很可能获得与 x86 变体不同的哈希值。

于 2011-02-19T10:59:07.110 回答
1

x86表示该算法针对 32 位平台进行了优化。这意味着它对 32 位无符号整数进行操作。

然后x64针对 64 位平台进行了优化,在 64 位无符号整数上运行。

此外,两者之间的结果也不兼容。相同输入的哈希值会有所不同,具体取决于它是否MurmurHash3_x86_128MurmurHash3_x64_128例如。

这是否意味着我必须使用 x64 函数并提供 x64 可执行文件才能在 x64 系统上使用此哈希库?或者我可以简单地使用 x86 版本,而只是遇到性能较差的问题?

可以为 32 位系统编译 64 位哈希函数,但最终会非常慢,因为编译器将计算分成两部分。如果 32 位支持很重要,您应该使用 x86 优化函数,而不是 x64 优化函数。在 x64 系统上,32 位代码运行良好,尽管我认为这是未充分利用的。x64 优化算法在 64 位 CPU 上效率更高。

我认为 _32 _64 _128 位版本仅意味着更多位版本提供更好的分布是否正确?

我想答案是肯定的。如果通过分发您的意思是“不太可能导致冲突”。散列中使用的每一个额外的内存位都会大大增加可能结果的数量。4 位散列有 16 个可能的散列,而 64 提供 18 quintillion(128 然后提供 340.2 undecillion!)。256 位提供了如此多的信息,以至于通常足以用于加密安全目的。


其他需要注意的事情:最近,现代散列函数利用新的 CPU 指令集,例如 CRC32、AES、SSE2、SIMD - 该函数利用特定的 CPU 功能/指令在支持的硬件下实现更好的性能。这可以大大加快支持这些现代功能的 CPU 上的散列速度。

于 2018-04-16T14:24:28.357 回答