目前Boost具有hash_combine函数,该函数输出32位无符号整数(确切地说,size_t).一些参考:
http://www.boost.org/doc/libs/1_43_0/doc/html/hash/reference.html#boost.hash_combine
http://www.boost.org/doc/libs/1_43_0/doc/html/hash/combine.html
我想探讨如何创建64位版本的hash_combine.
第一件事是获得64位的黄金比例或任何其他无理数.
第二部分是使用轮班.这部分相当棘手,我想询问是否有最佳实践或指导使用转移来获取哈希值?或者像原始代码一样选择班次:
seed ^= hash_value(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
Run Code Online (Sandbox Code Playgroud)
是随机的?
另外如何评估输出hash_combine以确保它不会产生比原始哈希函数更多的冲突hash_value?
请阅读http://burtleburtle.net/bob/hash/doobs.html了解有关哈希函数设计的一些基本信息,并阅读http://burtleburtle.net/bob/hash/中的其余文章了解更多详细信息。CityHash使用http://code.google.com/p/smhasher/进行了测试,您可以hash_combine使用相同的测试套件进行测试。
尽管我不是哈希方面的专家,但最近的哈希函数的设计使我相信 2-shift 技术 boost 的hash_combine()使用不再是最先进的,并且可以改进。
| 归档时间: |
|
| 查看次数: |
4496 次 |
| 最近记录: |