假设我想创建一组无序的unsigned int多序列。为此,我需要创建一个哈希函数来计算无序多集的哈希值。事实上,它也必须对CRC有利。
一个明显的解决方案是将项目放在向量中,对它们进行排序并返回结果的哈希值。这似乎有效,但价格昂贵。
另一种方法是对值进行xor,但显然如果我有一个项目两次或没有结果将是相同的 - 这是不好的。
任何想法如何实现这个更便宜 - 我有一个应用程序,将成千上万套,相对较大的。
答案 0 :(得分:2)
由于它是一个多集,因此您希望相同多重集的散列值相同,其表示可能具有以不同顺序呈现,添加或删除的相同元素。然后,您希望哈希值是可交换的,易于更新,并且对元素中的每个更改进行更改。您还希望两次更改不会轻易取消它们对哈希的影响。
除了最后一个标准之外,满足所有标准的一项操作是添加。只是总结元素。要保持总和有界,请以模数哈希值的大小为模。 (例如,对于64位散列,模2 64 。)为确保插入或删除零值会更改散列,请先为每个值添加一个。
总和的缺点是两个变化可以很容易地取消。例如。用2替换1 3.为了解决这个问题,你可以使用相同的方法并对条目的多项式求和,仍保持交换性。例如。而不是求和 x + 1 ,你可以求和 x 2 + x + 1 。现在,使用相同的总和更难设定一组变化。
答案 1 :(得分:0)
将内部multiset实现为value-> count哈希映射。
这将允许您通过以下方式避免偶数个元素通过xor取消的问题:您可以从计数和值构造一个新数字(例如,将它们相乘),而不是对每个元素进行xor处理。 ,然后你可以使用xor构建完整的哈希。