2012-12-10 69 views
0

我有两个字符串在单独的处理阶段被哈希成ulong(使用Google的CityHash),现在必须将这两个哈希合并为一个新的哈希,而不会显着增加哈希碰撞的风险。将两个ulong哈希组合到新的ulong哈希中

我知道XOR有一些问题(如价值^ 0 =值),但考虑到两个输入值应该已经被分流,我怀疑我可以结合哈希像

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

这种方法有什么问题吗?还是有更好的方法,不会增加显着的计算开销?

+0

为什么这个标记为* cryptography *?我的spidey感是刺痛的! –

+0

@NikBougalis:因为哈希应该符合密码分配标准。不用担心,我不会混淆加密和散列:-) –

+0

只是马金肯定;) –

回答

1

基于@ GregS的评论和我自己的进一步阅读,我相信我不会严重降低散列分布使用简单的XOR。

这是最明智的方法。

+0

嗯,这要看情况。如果你想让“ab”的结果与“ba”的结果相同,那就OK了。如果你希望他们不同于你至少不得不转移/繁殖其中一个合作伙伴。 – wildplasser

+0

@wildplasser:鉴于散列分布的其他特点,我认为这不是问题。当操作数具有比散列大小小得多的通常范围(例如,当对屏幕上的X,Y坐标进行散列/图形时),这更可能成为问题。 –

1

boost库以相当简单的方式执行此操作。

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

计算将是:

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

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

+0

这并不坏,但这个短小的东西不应该用在任何需要加密安全散列的地方。 –

+0

为什么hash1的左右移位?这个移位量是否适合64位数字?你有没有参考“提升”的方式? –

+0

http://www.boost.org/doc/libs/1_35_0/doc/html/boost/hash_combine_id241013.html –