关于FNV Hash结果的分布情况

FNV Hash算法对大量随机字符串计算后,通过取余运算通常能实现基本均匀分布,但存在微小偏差。32位FNV-1算法在特定范围内的分布不均匀,而64位情况更甚。Landon指出这种偏差可能对多数应用无影响,使用FNV-1a的lazy mode mapping方法可能会提供更好的分布。附带了32位FNV-1算法的示例代码。
摘要由CSDN通过智能技术生成

参考: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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值