具有顺序保留的哈希函数

Sim*_*mon 8 sorting algorithm hash

是否有任何哈希函数与uniq哈希码(如MD5)保持顺序?

注意:我不关心安全性,我需要它进行排序,我有很多块(~1MB大小),我想对它们进行排序,当然我可以使用索引排序但我想减少比较的时间

理论上:如果我有1'000'000块,1MB大小(1'048'576字节),并且它们在最后10个字节中都有差异,那么一个块与另一个块的比较时间将是O(n-10)和如果我将使用QuictSort(使〜(n log2(n))比较)那么比较的总时间将是n log2(n)*(k-10)(其中k是块大小)1'000'000*20*(1'048'576 - 10)

这就是为什么我想生成具有固定大小(例如16个字节)的订单保留哈希码,然后对块进行排序并保存结果(例如:在文件中)

小智 13

CHM(ZJ Czech,G.Havas和BS Majewski)是一种生成保留排序的最小完美散列的算法(例如,如果A <B,则h(A)<h(B)).它每个密钥使用大约8个字节的存储空间.

请参阅:http://cmph.sourceforge.net/chm.html


Gas*_*ssa 6

一般情况下,除非哈希的大小至少等于对象的大小,否则这样的函数是不可能的。

这个论点很简单:如果有 N 个对象,但 M < N 个哈希值,根据鸽巢原理,两个不同的对象会映射到一个哈希值,因此它们的顺序不会保留。

然而,如果我们保证对象的附加属性或放宽要求,则定制或概率解决方案可能成为可能。

  • @Simon:为了_保证_对于“A &lt; B”,“hash(A) &lt;= hash(B)”,您可以使用对象的前 16 个字节作为哈希。无论如何,对于您的特定数据集,这 16 个字节相等的可能性有多大?您可能正在尝试解决这里的一个非问题。 (3认同)
  • 在一般情况下这是不可能的,但无冲突哈希也是如此,我们在实践中并不担心这一点,因为冲突的概率可以忽略不计。对原始问题的合理解释是散列严格保留顺序*只要不存在冲突*。 (2认同)