0

我有两个字符串在不同的处理阶段被散列成一个 ulong(使用 Google 的 CityHash),现在必须将两个散列组合成一个新的散列,而不会显着增加散列冲突的风险。

我知道 XOR 有一些问题(例如 Value ^ 0 = Value),但鉴于两个输入值应该已经分布良好,我怀疑我可以像这样组合哈希

ulong hash = hash1 ^ hash2; // hash1 and hash2 are ulong hashes of strings

这种方法是否有问题,或者是否有更好的方法不会增加显着的计算开销?

4

2 回答 2

1

boost 库以一种相当简单的方式做到了这一点。

您可能需要计算 64 位的黄金数字。

计算将是:

ulong hash = hash1 ^ ( hash2 + 0x9e3779b9 + (hash1 << 6) + (hash1 >> 2);

我相信数字 0x9e3779b9 是 2^32/phi。Phi 是黄金比例。除以无理数试图以确定的方式添加“随机性”。

于 2012-12-11T00:11:47.293 回答
1

根据@GregS 的评论和我自己的进一步阅读,我相信我并没有通过使用简单的 XOR 来严重降低哈希分布。

这似乎是最明智的方法。

于 2012-12-13T00:56:47.407 回答