【发布时间】:2013-10-05 09:31:12
【问题描述】:
我的目标是有效地执行目录树的详尽差异。给定一组文件F,我必须计算等价类EQV = [F₁, F₂, F₃, ... Fₙ],使得fⱼ, fₖ ∈ EQV[i] iff (fⱼ is identical to fₖ) for all i, j, k。
我的一般方法是从一个包含所有初始文件的大类 EQV₀ = [[f₁, f₂, ..., fₙ]] 开始,然后根据一些 @987654329 反复将其拆分为更精细的类 EQV₁、EQV₂...EQVₘ₋₁ @启发式,例如,文件大小,校验和函数1,校验和2。在应用了所有m启发式(EQVₘ₋₁)之后,必须对EQVₘ₋₁中每个类中的所有文件进行成对差异。因为这最后一步对于EQVₘ₋₁ 中的每个类都是二次的,即
O(sum(n² for n in map(len, EQVₘ₋₁)) )
如果每个 m 拆分都在线性时间内完成,那么可能会成为我算法的瓶颈,我的目标是使 EQVₘ₋₁ 尽可能平坦。
我希望能够访问各种良好的哈希函数,我可以应用这些函数来最大程度地减少EQVₘ₋₁ 上的冲突。我目前的想法是使用一些库提供的校验和函数,例如 adler,并通过简单地将其应用于文件中的不同起始字节来生成它的变体。另一种是先应用快速散列函数,例如adler,然后只对仍然太大的类应用更昂贵的散列函数,例如md5。
考虑到我可以在一次读取文件中计算给定文件的所有哈希值,我如何计算各种哈希值来帮助我区分不同的文件?
另外,python 中可用的不加密安全的哈希函数列表有哪些?
编辑: 另一个想法似乎是使用基于一组固定的随机生成输入的“拉宾指纹”。这对这个目的有意义吗? http://en.wikipedia.org/wiki/Rabin_fingerprint
【问题讨论】:
-
感谢@Veedrac 的编辑,现在我知道如何格式化这些数学符号了。
标签: python diff md5 hash-function adler32