有序字符串到整数散列函数,保留其参数的字典顺序



假设我们有一个字节字符串集合,像往常一样按字典顺序排序。我们想要定义一个散列函数,将字符串映射到整数,这样散列值的排序就可以在足够的程度上保持字符串的排序。也就是说,给定字符串A小于或等于字符串B,H(A(应该总是产生一个小于或等于H(B(的值。

显然,这种不太好的散列函数是可能的。例如,我们可以为每个字符串取一个固定的前缀(例如,8个字节(,并假设它是一个大端无符号int64。生成的整数将按所需的顺序进行排序。这种方法甚至适用于较短的字符串:我们可以在短字符串上附加一些0,使其至少为前缀字节长(但前提是我们可以假设0不是有效的字节值(。

不幸的是,这种潜在的解决方案虽然简单快捷,但也有很大的缺点。在字符串往往具有相当大的公共前缀的情况下,它变得相当无用。当"0x00"是一个有意义的字节时,它不能处理比所选前缀短的字符串,并且我们希望先对较短的字符串排序,然后再对较长的字符串排序。

所以问题是,是否有可能做得更好?某种算术(或者更确切地说是Knuth的"具体数学"(技巧,它可以考虑字符串的所有字节,并产生一个适当排序的哈希值?

您能做的最好的事情是基于您能想到的字符串的最佳统计模型,应用保序算术编码,然后取其前缀来形成"hash";密码

根据该统计模型,每个哈希代码的可能性都是相等的。

如果你的模型只是所有字符串的可能性都相等,那么这就减少到你的";只要取一个前缀思想";。。。因此,这是否适用于你真的取决于你对字符串的了解程度,以及你需要这个代码有多好

还要注意,许多现实的模型也将允许更简单的编码方案"只要取一个前缀";又是一个例子。

人们可能认为他们想用";散列码";这样做是不现实的——你最终可能会做其他事情。也许你想问一下你真正的问题,这样我们就可以用其他方式帮助解决它。

最新更新