我有两个字符串在单独的处理阶段中被分成多个字符串(使用Google的CityHash),现在必须将两个哈希值组合成一个新的哈希值,而不会显着增加哈希冲突的风险。
我知道XOR有一些问题(例如Value ^ 0 = Value),但鉴于两个输入值应该已经很好地分布,我怀疑我可以像哈利这样组合哈希
ulong hash = hash1 ^ hash2; // hash1 and hash2 are ulong hashes of strings
这种方法有什么问题,还是有更好的方法不会增加显着的计算开销?
答案 0 :(得分:1)
boost库以相当简单的方式完成此任务。
您可能需要计算64位的黄金数。
计算将是:
ulong hash = hash1 ^ ( hash2 + 0x9e3779b9 + (hash1 << 6) + (hash1 >> 2);
我相信数字0x9e3779b9是2 ^ 32 / phi。披是黄金比例。无理数除法试图以确定的方式添加“随机性”。
答案 1 :(得分:1)
根据@ GregS的评论和我自己的进一步阅读,我相信我并没有通过使用简单的XOR来严重降低散列分布。
这种方法似乎最明智。