FNV哈希算法
FNV哈希算法
1. 特点和用途:
FNV能快速hash大量数据并保持较小的冲突率,他的高度分散是他适用于hash一些非常相近的字符串,比如URL、hostname、文件名、text、IP地址等
2. 算法描述
- 相关变量
- hash值:一个n位的unsigned int型hash值
- offset_basis:初始的哈希值
- FNV_prime:FNV用于散列的质数
- octet_of_data:8位数据(即一个字节)
** FNV-1描述
hash = offset_basis
for each octet_of_data to be hashed
hash = hash * FNV_prime
hash = hash xor octet_of_data
return hash
** FNV-1a描述
hash = offset_basis
for each octet_of_data to be hashed
hash = hash xor octet_of_data
hash = hash * FNV_prime
return hash
java 代码. HashUtil.fnvHash(String);
/**
* 改进的32位FNV算法1
*
* @param data 字符串
* @return hash结果
*/
public static int fnvHash(String data) {
final int p = 16777619;
int hash = (int) 2166136261L;
for (int i = 0; i < data.length(); i++) {
hash = (hash ^ data.charAt(i)) * p;
}
hash += hash << 13;
hash ^= hash >> 7;
hash += hash << 3;
hash ^= hash >> 17;
hash += hash << 5;
return Math.abs(hash);
}

浙公网安备 33010602011771号