FNV hash算法
原文: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算法的更多相关文章
- 【数据结构与算法】一致性Hash算法及Java实践
追求极致才能突破极限 一.案例背景 1.1 系统简介 首先看一下系统架构,方便解释: 页面给用户展示的功能就是,可以查看任何一台机器的某些属性(以下简称系统信息). 消息流程是,页面发起请求查看指定机 ...
- 常用hash算法及评测[转]
RS hash 算法 unsigned int RSHash(char* str, unsigned int len) { unsigned int b = 378551; un ...
- FNV与FNV-1a Hash算法说明【转】
转自:http://blog.csdn.net/jiayanhui2877/article/details/12090575 The core of the FNV hash The core of ...
- hash算法总结收集
hash算法的意义在于提供了一种快速存取数据的方法,它用一种算法建立键值与真实值之间的对应关系,(每一个真实值只能有一个键值,但是一个键值可以对应多个真实值),这样可以快速在数组等条件中里面存取数据. ...
- MurmurHash算法:高运算性能,低碰撞率的hash算法
MurmurHash算法:高运算性能,低碰撞率,由Austin Appleby创建于2008年,现已应用到Hadoop.libstdc++.nginx.libmemcached等开源系统.2011年A ...
- 一致性hash算法简介与代码实现
一.简介: 一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义: 1.平衡性(Balance) 2.单调性(Monotonicity) 3.分散性(Spread) 4.负 ...
- 常用的Hash算法
1.RSHash unsigned int RSHash(const std::string& str) { unsigned int b = 378551; unsigne ...
- 常见hash算法的原理
散列表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法.顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙. 散列表(Hash table,也叫 ...
- Hash算法入门指南(聊点不一样的算法人生)
前言 很多人到现在为止都总是问我算法该怎么学啊,数据结构好难啊怎么的,学习难度被莫名的夸大了,其实不然.对于一个学计算机相关专业的人都知道,数据结构是大学的一门必修课,数据结构与算法是基础,却常常容易 ...
随机推荐
- 第二百九十八节,python操作redis缓存-Set集合类型,可以理解为不能有重复元素的列表
python操作redis缓存-Set集合类型,可以理解为不能有重复元素的列表 sadd(name,values)name对应的集合中添加元素 #!/usr/bin/env python # -*- ...
- [转]MySQL远程连接ERROR 2003 (HY000):Can't connect to MySQL server on'XXXXX'(111) 的问题
问题描述: 从一台Linux远程连接另一台linux上的MySQL, 出现ERROR 2003 (HY000): Can't connect to MySQL server on 'xxx.xxx.x ...
- “Chaos”的算法之Floyd算法
倘若我们要在计算机上建立一个交通咨询系统则可以采用图的结构来表示实际的交通网络.其实现最基本的功能,求出任意两点间的最短路径, 求最短路径的经典方法有很多种,最常用的便是迪杰斯特拉算法和佛洛依德(Fl ...
- MPC8313ERDB在Linux从NAND FLASH读取UBoot环境变量的代码分析
MPC8313ERDB在Linux从NAND FLASH读取UBoot环境变量的代码分析 Yao.GUET@2014-05-19 一.故事起因 由于文件系统的增大,已经大大的超出了8MB的NOR FL ...
- linux服务器检测CPU使用率、负载以及java占用CPU使用率的shell脚本
#!/bin/bash CPU=`top -b -n 1|grep Cpu|awk '{print $2}'|cut -f 1 -d "."`LOAD=`top -b -n 1|g ...
- 转:windows 下 netsh 实现 端口映射(端口转发)
本文转自:本文出自 “httpyuntianjxxll.spac..” 博客,请务必保留此出处http://333234.blog.51cto.com/323234/1135361 -----hapr ...
- [转] 在图标库中,找到合适的图标 ico
作者:xlrocket链接:https://www.zhihu.com/question/19857245/answer/241696797 在图标库中,找到合适的图标 或许,一些小伙伴会有收集图标的 ...
- error: Allowed memory size
错误提示 error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 35 bytes) in D:\www\Th ...
- RedisTemplate实现事物问题剖析和解决
一.问题描述 Redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,Redis对事物支持不会很复杂,当一个客服端连接Redis服务时,发出了MULTI命令时,这个连接会进入事物,在执行MU ...
- Java类的设计----方法的重写、覆盖
方法的重写.覆盖 在子类中可以根据需要对从父类中继承来的方法进行改造—覆盖方法(方法的重置.重写),在程序执行时,子类的方法将覆盖父类的方法. 覆盖方法必须和被覆盖方法具有相同的方法名称.参数列表和返 ...