FNV哈希算法

FNV哈希算法

1. 特点和用途:

FNV能快速hash大量数据并保持较小的冲突率,他的高度分散是他适用于hash一些非常相近的字符串,比如URL、hostname、文件名、text、IP地址等

2. 算法描述

  • 相关变量
  1. hash值:一个n位的unsigned int型hash值
  2. offset_basis:初始的哈希值
  3. FNV_prime:FNV用于散列的质数
  4. 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);
	}

posted @ 2022-07-06 19:38  zrx001  阅读(682)  评论(0)    收藏  举报