逐步散列元素集的好方法是什么?这必须发生,以便可以按任何顺序添加和删除元素,并且仍然相等的集具有相同的散列。目的是能够从集合中快速找到集合或其轻微修改。
对合并运算符的向量空间方法
这是不起作用的东西。可以将b位整数整数视为GF(2)上的向量空间V,其中加法是XOR运算符(例如10 + 11 = 01),乘以0或1是组件 - 逻辑与 - (例如1 * 10 = 10,0 * 10 = 00)。可以将元素的随机(但固定)映射到b位整数E = {e_1,...,e_b},然后通过将元素的散列相加在一起来计算集合的散列。在这样做时,必须确保E形成向量空间V的基础;否则哈希不能使用b位整数的所有值。
该技术的问题在于,如果E基的使用子集不具有任何基矢量e_i的非零第一分量,则得到的散列不能是奇数。类似的问题依赖于使用的基矢的哪个子集。总之,不应该使用XOR来查找集合的哈希值。使用正常求和+可能不是更好。
答案 0 :(得分:0)
一种解决方案是增加红黑树,以便每个节点包含以该节点为根的子树的组合哈希(始终将左子哈希与当前节点哈希与右子哈希结合)。这允许在常量时间(根节点的散列)中找到所有元素的散列,否则不会影响红黑树的属性。可以创建通用的红黑树实现,其允许自动更新节点中的分层信息,其中更新规则由数据结构的用户指定。由于红黑树在重新平衡时可能会旋转,这意味着哈希组合函数必须是关联的。在Tillich和Zémor的文章“Hashing with SL2”中,可以找到具有关联散列组合函数(矩阵乘法)的散列函数。我不确定这是否具有可接受的性能。