Hash 对未知输入具有良好一致性的哈希函数

Hash 对未知输入具有良好一致性的哈希函数,hash,uniform,Hash,Uniform,我正在寻找一个哈希函数,它可以分割一大组输入 将均匀性好的数据分配到少量分区(例如100或100个分区) 256). 这意味着我期待很多碰撞,我不在乎碰撞 输入数据事先未知。我希望字符串有一个长度 可能在6到100字节之间。弦可能分布得很不均匀 (例如,填充有空格或仅包含数字的较大部分) CRC算法是最先想到的想法之一。 已提出,但未提供有关其 一致性;对于CRC32,显然是 有一个或哈希函数的列表, 但没有说明它们的一致性 Bob Jenkins对返回 32位值。我假设对于均匀分布的32位值

我正在寻找一个哈希函数,它可以分割一大组输入 将均匀性好的数据分配到少量分区(例如100或100个分区) 256). 这意味着我期待很多碰撞,我不在乎碰撞

输入数据事先未知。我希望字符串有一个长度 可能在6到100字节之间。弦可能分布得很不均匀 (例如,填充有空格或仅包含数字的较大部分)

CRC算法是最先想到的想法之一。 已提出,但未提供有关其 一致性;对于CRC32,显然是

有一个或哈希函数的列表, 但没有说明它们的一致性

Bob Jenkins对返回 32位值。我假设对于均匀分布的32位值 此外,所有可能的8位子集应均匀分布,因此 他们是很好的候选人。但将32位的值减少到
如果有更简单的8位算法,则为8位值?

我发现sdbm算法表现出良好的一致性,非常简单:

        h := 0.
        forEach ch in str {
            h := (h * 65599) + ch;
        }

伯恩斯坦的杂烩也在詹金斯的网页上,一点也不坏,而且非常简单。我在任何地方都使用它,当需要“只是一些杂凑”的时候。没有任何问题。如果您担心它不够“随机”,您甚至可以将加法和xor变体组合成一个,这通常会通过管道传输到相同的循环数。顺便提一下,CRC的设计原理主要不是为了产生一个分布良好的散列,而是为了检测意外的位翻转。使用机器的本机寄存器大小(32位)进行计算不会受到惩罚,大多数操作都是在(符号)将操作数扩展到本机int大小之后执行的。截断(或取模)将很便宜(但不是免费的)。并非所有哈希函数的最右边位都有足够的熵。