一尘不染

创建两个数字的哈希码

algorithm

我正在尝试为(a + b)C#中的复数类创建快速哈希码函数。

我已经多次看到这种a.GetHashcode()^b.GetHashCode()方法。但是,这将给予相同的哈希码(a,b)(b,a)

是否有任何标准算法可以做到这一点,.Net框架中是否有任何功能可以帮助您?


阅读 180

收藏
2020-07-28

共1个答案

一尘不染

我为任意一组可哈希项创建哈希码的常规方法是:

int hash = 23;
hash = hash * 31 + item1Hash;
hash = hash * 31 + item2Hash;
hash = hash * 31 + item3Hash;
hash = hash * 31 + item4Hash;
hash = hash * 31 + item5Hash;
// etc

在你的情况下item1Hash可能只是a,也item2Hash可能只是b

只要它们是质数(或至少是互质数),则23和31的值就相对无关紧要。

显然仍然会有冲突,但是您不会遇到以下常见的令人讨厌的问题:

hash(a, a) == hash(b, b)
hash(a, b) == hash(b, a)

如果您更多地了解ab可能是什么,那么您可能会做得更好,但这是一个很好的初始实现,很容易记住和实现。请注意,如果有可能在勾选“检查算术上溢/下溢”的情况下构建程序集,则应将其全部置于未检查的块中。(对于此算法,溢出是可以的。)

2020-07-28