什么是英语单词的好哈希函数?

Mik*_*e G 18 c c++ hash

我有很多英文单词,我想哈希.什么是良好的散列函数?到目前为止,我的散列函数将字母的ASCII值相加,然后以表格大小为模.我正在寻找一些有效而简单的东西.

leo*_*loy 17

简单地对字母求和并不是一个好的策略,因为排列给出了相同的结果.

这个(djb2)很受欢迎,并且与ASCII字符串很好地配合.

unsigned long hashstring(unsigned char *str)
{
    unsigned long hash = 5381;
    int c;

    while (c = *str++)
        hash = ((hash << 5) + hash) + c; /* hash * 33 + c */

    return hash;
}
Run Code Online (Sandbox Code Playgroud)

如果您需要更多替代方案和一些性能测量,请在此处阅读.

补充:这些是一般的散列函数,其中输入域事先不知道(除了一些非常一般的假设:例如上面的函数稍微好于ascii输入),这是最常见的情况.如果你有一个已知的受限域(固定的输入集)你可以做得更好,请参阅Fionn的答案.

  • 它理论上可以返回任何有效的`unsigned long`值.由你操纵哈希以适应你的约束. (2认同)
  • @MikeG:一般来说,你没有在哈希算法中指定表大小(如果你不知道它,请使用已经制作的表......).表可能会根据项目的数量增长或缩小(对于良好的实现),因此您只需计算哈希值,并以当前大小为模的哈希值来知道将其放入哪个桶中. (2认同)

Fio*_*onn 8

也许这样的事情会对你有所帮助:http://www.gnu.org/s/gperf/

它为输入域生成优化的散列函数.


sel*_*bie 6

如果你不需要加密安全,我会建议Murmur哈希.它速度极快,扩散率高.使用方便.

http://en.wikipedia.org/wiki/MurmurHash

http://code.google.com/p/smhasher/wiki/MurmurHash3

如果你确实需要加密安全散列,那么我建议通过OpenSSL使用SHA1.

http://www.openssl.org/docs/crypto/sha.html