参考:http://www.isthe.com/chongo/tech/comp/fnv/
关于FNV Hash算法的详情,见参考,下面只记录FNV Hash值的分布情况。
FNV hash算法对一个字符串计算,可以得到一个唯一确定的无符号整数值。对于大量的随机输入字符串,比如UUID串,得到的无符号整数值,通过简单的取余运算,基本上是均匀分布的。比如,对100,000个UUID字符串做FNV Hash计算,得到的每个结果值hashValue,都做 hashValue %= 10,000,其结果基本上是在 0 ~ 9,999 范围内均匀分布的。但是请注意,是“基本上“均匀分布,事实上还存在一定的偏差。
Landon在参考页面中详细介绍了直接取余的 Lazy mode mapping method 和 Retry method。
Lazy mode mapping method(以32 bit 、目标范围 0~2142779559 、FNV-1 为例)做法是:
#define TRUE_HASH_SIZE ((u_int32_t)2142779560) /* range top plus 1 */
#define FNV1_32_INIT ((u_int32_t)2166136261)
u_int32_t hash;
void *data;
size_t data_len;
hash = fnv_32_buf(data, data_len, FNV1_32_INIT);
hash %= TRUE_HASH_SIZE;