关联哈希混合


14

考虑纯功能设置中的单链链接。它的赞美声从山顶传来,并将继续传给人们。在这里,我将讨论其众多优势之一,以及如何将其扩展到基于树的更广泛的纯功能序列类别的问题。

问题如下:您想通过强哈希在O(1)时间内测试几乎某些结构相等性。如果哈希函数在结构上是递归的,即哈希(x:xs)=混合x(哈希xs),则可以将哈希值透明地缓存在列表中,并在元素被限制在现有列表中的情况下,在O(1)时间更新它们。大多数哈希列表算法在结构上都是递归的,因此这种方法在实践中非常有用。

但是,假设您不是基于单链列表,而是具有基于树的序列,该序列支持在O(log n)时间内连接两个长度为O(n)的序列。为了使散列缓存在这里起作用,散列混合函数必须具有关联性,以便尊重树在表示相同线性序列时所具有的自由度。混合器应获取子树的哈希值,并计算整个树的哈希值。

这是六个月前的一天,当时我花了一天时间思考并研究这个问题。在有关数据结构的文献中似乎没有引起注意。我确实遇到了来自密码学的Tillich-Zemor哈希算法。它依赖于2x2矩阵乘法(关联),其中位0和1对应于在Galois字段中具有条目的子代数的两个生成器。

我的问题是,我错过了什么?我在搜索中找不到的关于密码学和数据结构的文献中必定有相关的论文。任何对此问题的评论以及可能探索的场所将不胜感激。

编辑:我对频谱的软性和加密性强端都对这个问题感兴趣。在较软的方面,它可以用于哈希表,在该表中应避免冲突,但不会造成灾难性的后果。从更有利的方面,它可以用于相等性测试。

Answers:


2

补充:在阅读了Per的评论之后,我认为这个答案只是问题中已经提到的Tillich-Zemor哈希算法的(较差)变体。我撤回了这个答案,但我希望它(和评论)对某些读者有用。


编辑:此答案的较早版本建议在[ m ] 上使用monoid操作,但是正如Per在评论中指出的那样,最好使用组操作。

这个答案是关于为哈希表构建一个易于实现的哈希函数。不能保证质量。

假设您已经对一个有限集合[ m ] = {1,…,m } 的序列的每个元素具有哈希函数,那么如何将[ m ]的每个元素解释为有限组G中的元素并使用对G进行分组操作?您可以使用从[ m ]到G的任何映射,但是希望映射是单射的,这样我们就不会丢失每个元素的哈希值中的信息。还希望该组不是可交换的,以便散列函数可以捕获序列中元素顺序的差异。

我对允许快速运算的有限组了解不多,但是我想这样的组在编码理论中是众所周知的。使用至少m阶的对称组可能不是很糟糕。


1
是的,Tillich-Zemor哈希也使用矩阵乘法。您的建议如果不作进一步修改,将无法生效。例如,您必须避免奇异矩阵,否则将在0处获得累加,从而破坏了哈希统计量。Tillich-Zemor在Galois油田工作;他们的算法的较早版本存在问题,因为他们使用的生成多项式具有次优统计量,因此特定的Galois字段可能非常重要。
Per Vognsen

@Per:我明白了。谢谢您的解释。那如何使用有限组呢?我修改了答案。
伊藤刚(Tsuyoshi Ito)2010年

我同意。生成无限组族的最佳方法是在有限域上使用矩阵组(请参见有限简单组的分类定理),因此这种形式的算法似乎属于Tillich-Zemor类型。
Per Vognsen

@Per:我对群论不熟悉,我看不到为什么在这种情况下有限域上的矩阵群比对称群更好。你能详细说明吗?
伊藤刚(Tsuyoshi Ito)2010年

1
有两个原因。例如,对于大的对称组,您不能有效地进行计算,并且需要使组的大小在2 ^ 128左右才能具有抗碰撞性。相比之下,您可以非常有效地利用特征2个有限域上的矩阵进行计算,尤其是在选择稀疏生成器多项式的情况下;这只是一堆操作。
Per Vognsen

1

几乎通用的哈希函数系列

{ha(x)=aiximodp:aZp}

在这里有一个不错的属性:,其中“”表示级联。如果缓存在每个树中的散列值以及两者的根一个| x | ,您可以计算O中的两棵树的级联散列ha(x)+a|x|ha(y)=ha(xy)a|x|O(1)Zp

xyO(min(|x|,|y|)/p)


1

nn,ny,yny=H(y,y)HO(1)O(lgn)

H(x1,,xm)x1,,xmm

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.