Hash 将两个ulong散列组合成新的ulong散列

Hash 将两个ulong散列组合成新的ulong散列,hash,cryptography,Hash,Cryptography,我有两个字符串在单独的处理阶段被散列成一个ulong(使用谷歌的CityHash),现在必须将这两个散列合并成一个新的散列,而不会显著增加散列冲突的风险 我知道XOR有一些问题(比如Value^0=Value),但是考虑到这两个输入值应该已经是均匀分布的,我怀疑我可以像这样组合散列 ulong hash = hash1 ^ hash2; // hash1 and hash2 are ulong hashes of strings 这种方法是否有错误,或者是否有一种更好的方法不会增加显著的计算开

我有两个字符串在单独的处理阶段被散列成一个ulong(使用谷歌的CityHash),现在必须将这两个散列合并成一个新的散列,而不会显著增加散列冲突的风险

我知道XOR有一些问题(比如Value^0=Value),但是考虑到这两个输入值应该已经是均匀分布的,我怀疑我可以像这样组合散列

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

这种方法是否有错误,或者是否有一种更好的方法不会增加显著的计算开销?

boost库以一种相当简单的方式来实现这一点

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

计算方法如下:

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

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

根据@GregS的评论和我自己的进一步阅读,我相信我没有通过使用简单的异或来严重降低散列分布


这似乎是最明智的方法。

为什么这是标记加密?我的蜘蛛感觉很刺痛!@NikBougalis:因为散列应该符合分发的加密标准。不用担心,我不会混淆加密和散列:-)@NikBougalis:是的,我有一点“散列和加密有何不同?”因为这个主题经常出现,所以你不需要加密散列,这很好,因为CityHash没有给你。将两个CityHash进行异或运算应该很好。@GregS:同意,CityHash没有加密哈希属性。然而,我自己的测试和其他人的测试表明它非常好(同时也相当快)。我只是不想在组合这两个散列时从“非常好”变成“嗯”。这还不错,但同样地,在需要加密安全散列的任何地方都不应该使用这个简短的东西。为什么散列1会左右移动?该移位量适合64位数字吗?你有“推进”方式的参考资料吗?嗯,这要看情况而定。如果您希望“ab”的结果与“ba”的结果相同,则可以。如果你想让它们不同于你,你至少必须移动/乘以其中一个伙伴。@wildplasser:考虑到其他方面的强大散列分布,我认为这不是问题。当to操作数的通常范围远小于散列大小时(例如,在屏幕/a图形上散列X,Y坐标时),这很可能成为一个问题。