我正在尝试为(a + b)C#中的复数类创建快速哈希码函数。
(a + b)
我已经多次看到这种a.GetHashcode()^b.GetHashCode()方法。但是,这将给予相同的哈希码(a,b)和(b,a)。
a.GetHashcode()^b.GetHashCode()
(a,b)
(b,a)
是否有任何标准算法可以做到这一点,.Net框架中是否有任何功能可以帮助您?
我为任意一组可哈希项创建哈希码的常规方法是:
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。
item1Hash
a
item2Hash
b
只要它们是质数(或至少是互质数),则23和31的值就相对无关紧要。
显然仍然会有冲突,但是您不会遇到以下常见的令人讨厌的问题:
hash(a, a) == hash(b, b) hash(a, b) == hash(b, a)
如果您更多地了解a并b可能是什么,那么您可能会做得更好,但这是一个很好的初始实现,很容易记住和实现。请注意,如果有可能在勾选“检查算术上溢/下溢”的情况下构建程序集,则应将其全部置于未检查的块中。(对于此算法,溢出是可以的。)