我正在寻找一个对大量输入进行分区的哈希函数
对少量分区具有良好一致性的数据(例如100或
256)。这意味着我期望发生很多碰撞,并且我不关心碰撞。
事先不知道输入数据。我希望字符串的长度
在6到100个字节之间。字符串可能分布很差
(例如,大部分由空格填充或仅包含数字)。
CRC算法是最早想到的思想之一。
已提出CRC8,但未提供其信息
均匀性对于CRC32显然是uniformity is not that good。
列出了simple或general purpose哈希函数,
但没有透露它们的统一性。
鲍勃· Jenkins (Bob Jenkins)在哈希函数方面有完整的article,该哈希函数返回一个
32位值。我想对于一个均匀分布的32位值
而且所有可能的8位子集都应均匀分布
是好的候选人。但是将32位值减小为
8位值是否有8位的更简单算法?
最佳答案
我发现sdbm算法显示出很好的一致性,非常简单:
h := 0.
forEach ch in str {
h := (h * 65599) + ch;
}