原文:https://blog.csdn.net/u013137970/article/details/79020095

FNV算法简介
FNV算法属于非密码学哈希函数,它最初由Glenn Fowler和Kiem-Phong Vo于1991年在IEEE POSIX P1003.2上首先提出,最后由Landon Curt Noll 完善,故该算法以三人姓的首字母命名。

FNV算法目前有三种,分别是FNV-1,FNV-1a和FNV-0,但是FNV-0算法已经被丢弃了。FNV算法的哈希结果有32、64、128、256、512和1024位等长度。如果需要哈希结果长度不属于以上任意一种,也可以采用根据Changing the FNV hash size - xor-folding上面的指导进行变换得到。

算法过程
FNV-1
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

参数说明(以32位结果为例,其它长度同理):

所有的参数,除了octet_of_data之外,都是32位无符号整型,即hash、offset_basis、FNV_prime类型都是32位无符号整型;
octet_of_data的类型是8位无符号整型;
32位的offset_basis值为2166136261=0x811c9dc5,FNV_prime值为2^24 + 2^8 + 0x93 = 16777619,其它参数可以查看FNV的维基百科主页;
算法循环的次数等于输入的字节长度;
算法的相乘部分,因为hash类型是32位无符号整型,故相乘结果需要mod 2^32;
算法的异或部分,octet_of_data为32位值的低8位,其它三个字节不进行异或运算。
举例:

输入“V”,对应的十六进制值为0x56,输出32位的FNV hash值为0x050c5d49。可以使用在线工具得到结果。

计算过程:

初始化:hash = 2166136261
进入循环,因为要求的数据长度只有一个字节长度,故循环只有一次。因为hash结果为32位无符号整型,故需要舍弃高位,保留低32位:hash = (2166136261 * 16777619) mod 2^32 = 0x050c5d1f
进行异或运算,首先将0x56转化为32位的值0x00000056,然后才能进行异或运算:hash = 0x050c5d1f xor 0x00000056 = 0x050c5d49
也可以点击参考资料中的FNV函数Go代码更加深刻地理解上述计算过程。

FNV-1a
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

  

可以发现,FNV-1a算法只是将相乘和异或运算进行了顺序调换,其它过程和参数与FNV-1相同。

FNV-0
FNV-0算法过程如下:

hash = 0
for each octet_of_data to be hashed
hash = hash * FNV_prime
hash = hash XOR octet_of_data
return hash

  

参考资料
FNV Hash:详细介绍FNV算法的网站。在该网站上可以找到该算法的历史,应用以及源码等资料。
Fowler–Noll–Vo hash function:FNV算法的维基百科主页。
Source file src/hash/fnv/fnv.go:FNV函数的Go语言实现代码,可以更加深入理解FNV算法过程。

FNV hash算法的更多相关文章

  1. 【数据结构与算法】一致性Hash算法及Java实践

    追求极致才能突破极限 一.案例背景 1.1 系统简介 首先看一下系统架构,方便解释: 页面给用户展示的功能就是,可以查看任何一台机器的某些属性(以下简称系统信息). 消息流程是,页面发起请求查看指定机 ...

  2. 常用hash算法及评测[转]

    RS hash 算法 unsigned int RSHash(char* str, unsigned int len) {     unsigned int b    = 378551;     un ...

  3. FNV与FNV-1a Hash算法说明【转】

    转自:http://blog.csdn.net/jiayanhui2877/article/details/12090575 The core of the FNV hash The core of ...

  4. hash算法总结收集

    hash算法的意义在于提供了一种快速存取数据的方法,它用一种算法建立键值与真实值之间的对应关系,(每一个真实值只能有一个键值,但是一个键值可以对应多个真实值),这样可以快速在数组等条件中里面存取数据. ...

  5. MurmurHash算法:高运算性能,低碰撞率的hash算法

    MurmurHash算法:高运算性能,低碰撞率,由Austin Appleby创建于2008年,现已应用到Hadoop.libstdc++.nginx.libmemcached等开源系统.2011年A ...

  6. 一致性hash算法简介与代码实现

    一.简介: 一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义: 1.平衡性(Balance) 2.单调性(Monotonicity) 3.分散性(Spread) 4.负 ...

  7. 常用的Hash算法

    1.RSHash unsigned int RSHash(const std::string& str) {    unsigned int b    = 378551;    unsigne ...

  8. 常见hash算法的原理

    散列表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法.顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙. 散列表(Hash table,也叫 ...

  9. Hash算法入门指南(聊点不一样的算法人生)

    前言 很多人到现在为止都总是问我算法该怎么学啊,数据结构好难啊怎么的,学习难度被莫名的夸大了,其实不然.对于一个学计算机相关专业的人都知道,数据结构是大学的一门必修课,数据结构与算法是基础,却常常容易 ...

随机推荐

  1. JavaScript 杂乱的小总结

    基本类型只有String.number.boolean.null.undefined,还有一个Object.存在装箱类型,不过后台自动转换. 通过new创建对象时,如果没有参数,可以省略“()”.-- ...

  2. linux 打包 解压 tar zip tgz

    .tar 解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!)------------------------- ...

  3. iOS7入门开发全系列教程新地址

    包括了系列1所有.系列2所有,系列3部分(进行中) 由于大家都知道的原因,换了github保存: https://github.com/eseedo/kidscoding 假设下载有问题能够留言,请在 ...

  4. Hbase1.1.0.1配置集群

    参考链接 http://wuyudong.com/archives/119?utm_source=tuicool 参考链接 http://www.cnblogs.com/archimedes/p/45 ...

  5. Windows性能监视器

    前端时间在做动态目标监控,应用程序需要考虑大数据量和多用户并发的操作,系统的性能是解决方案实施性的重要度量.这里简单的记录下Windows中性能监视查看和简单分析. 一般操作系统性能主要涉及到的问题主 ...

  6. Ubuntu下 Oracle sqldeveloper中文目录、文件,select查询结果中:中文乱码

    是由于JDK所致.下面是网上的解决方案 解决案例1: .0_24/jre/lib/fonts.进入到fonts目录,新建文件夹 fallback cd /usr/java/jdk1..0_24/jre ...

  7. CSS background 之设置图片为背景技巧

    首先先来看看background有那些值: 可以按顺序设置如下属性(可点击进入相应的css手册查看使用):background-color 背景颜色background-image 背景图片backg ...

  8. Git 的BUG小结

    Git 的BUG小结 Git 在push的时候出现了: fatal: The remote end hung up unexpectedly 在网上找了非常多  发现出现了下面错误提示也可能是同样的问 ...

  9. Java课后简答题

    1.简述Java的特点. 面向对象.跨平台性.健壮性.安全性.可移植性.多线程性.动态性等. 2.简述JRE与JDK的区别. JRE(Java Runtime Environment,Java运行时环 ...

  10. java.lang.OutOfMemoryError 错误分类

    java.lang.OutOfMemoryError: Java heap space原因:Heap内存溢出,意味着Young和Old generation的内存不够.解决:调整java启动参数 -X ...