FNV算法实战
HASH算法介绍
- Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一地确定输入值。
- 数学表述为:h = H(M) ,其中H( )--单向散列函数,M--任意长度明文,h--固定长度散列值。
HASH算法的实际应用-加密
- 常见的哈希加密算法:MD5,SHA-1,SHA-2,SHA-256,SHA-X(系列)
- 1) 文件校验:MD5 Hash算法的“数字指纹”特性,使它成为目前应用最广泛的一种文件完整性校验和(Checksum)算法,不少Unix系统有提供计算md5 checksum的命令;
- 2) 数字签名:在这种签名协议中,双方必须事先协商好双方都支持的Hash函数和签名算法。签名方先对该数据文件进行计算其散列值,然后再对很短的散列值结果--如Md5是16个字节,SHA1是20字节,用非对称算法进行数字签名操作。对方在验证签名时,也是先对该数据文件进行计算其散列值,然后再用非对称算法验证数字签名; (实际是HASH+非对称加密)
- 3) 鉴权协议:需要鉴权的一方,向将被鉴权的一方发送随机串(“挑战”),被鉴权方将该随机串和自己的鉴权口令字一起进行 Hash 运算后,返还鉴权方,鉴权方将收到的Hash值与在己端用该随机串和对方的鉴权口令字进行 Hash 运算的结果相比较(“认证”),如相同,则可在统计上认为对方拥有该口令字,即通过鉴权。(摘要)
- HASH加密算法与其他加密算法的主要不同点是:哈希(Hash)算法是一种单向密码体制,即只有 加密过程,没有解密过程
HASH算法的实际应用-查找
- 常见的哈希查找算法:BKDRHash,APHash,DJBHash,JSHash,RSHash,SDBMHash等
- 1) 基本思想是:以数据对象的关键词 key 为自变量,通过一个确定的函数关系 $h$ ,计算出对应的函数值 $h(key)$ ,把这个值解释为数据对象的存储地址,并按此存放,即“$存储位置=h(key)$”。
- Gdb下函数符号实际对应的是一个内存地址,映射大小为32bit或64bit(即32位系统或64位系统)
FNV算法介绍
- FNV哈希算法全名为Fowler-Noll-Vo算法,是以三位发明人Glenn Fowler,Landon Curt Noll,Phong Vo的名字来命名的,最早在1991年提出
- 特点和用途:FNV能快速hash大量数据并保持较小的冲突率,它的高度分散使它适用于hash一些非常相近的字符串,比如URL,hostname,文件名,text,IP地址等。
- 适用范围:比较适用于字符串比较短的哈希场景
FNV哈希算法有如下两种,FNV-1a相比FNV-1,散列分布更好。二者不同点为:for循环两行代码的顺序相反

哈希函数一般适用移位和乘除法来实现。哈希函数一般都比较精简,算法复杂度比较低。哈希函数的移位和乘除法可能会导致数据丢失,这也是哈希不可逆的原因
FNV算法说明-1
- hash值:一个n位的unsigned int型hash值,初始值为offset_basis.
- offset_basis:初始的哈希值,该值在最早的版本中是0,为了增强哈希的可靠性,后续修改为非0的值,通过如下算法获取

参见《生成offset_basis.py》
FNV算法说明-2
octet_of_data:8位数据(即一个字节):即需要被哈希的字符串
FNV_prime:FNV用于散列的质数(质数在哈希算法中发挥着重要作用,在一般使用的哈希除留余数法中: H(key) = key MOD p,p也要求是一个质数(质数也称为素数))
- 32 bit FNV_prime = 224 + 28 + 0x93 = 16777619
- 64 bit FNV_prime = 240 + 28 + 0xb3 = 1099511628211
- 128 bit FNV_prime = 288 + 28 + 0x3b = 309485009821345068724781371
- 256 bit FNV_prime = 2168 + 28 + 0x63 = 374144419156711147060143317175368453031918731002211
- 512 bit FNV_prime = 2344 + 28 + 0x57 = 35835915874844867368919076489095108449946327955754392558399825615420669938882575126094039892345713852759
FNV算法使用
- 支持将字符串哈希为32/64/128/256/512/1024bit的数字
- 支持将字符串哈希为任意bit的数字,比如11/33bit
- 支持将字符串哈希为特定范围的数字,比如[0,99999]
将字符串哈希为32bit的数字
hash = offset_basis
for each octet_of_data to be hashed
hash = hash xor octet_of_data
hash = hash * FNV_prime
return hash
参见《生成32位哈希.py》
将字符串哈希为特定范围的数字
将字符串哈希为[,]的数字
#define TRUE_HASH_SIZE ((u_int32_t)50000) /* range top plus 1 */
#define FNV_32_PRIME ((u_int32_t)16777619)
#define FNV1_32_INIT ((u_int32_t)2166136261)
#define MAX_32BIT ((u_int32_t)0xffffffff) /* largest 32 bit unsigned value */
#define RETRY_LEVEL ((MAX_32BIT / TRUE_HASH_SIZE) * TRUE_HASH_SIZE)
u_int32_t hash;
void *data;
size_t data_len; hash = fnv_32_buf(data, data_len, FNV1_32_INIT);
while (hash >= RETRY_LEVEL) {
hash = (hash * FNV_32_PRIME) + FNV1_32_INIT;
}
hash %= TRUE_HASH_SIZE;
参见《生成任意范围哈希.py》,代码附件链接
参考:
http://www.isthe.com/chongo/tech/comp/fnv/index.html#lazy-mod
FNV算法实战的更多相关文章
- python聚类算法实战详细笔记 (python3.6+(win10、Linux))
python聚类算法实战详细笔记 (python3.6+(win10.Linux)) 一.基本概念: 1.计算TF-DIF TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库 ...
- 秒懂机器学习---k-近邻算法实战
秒懂机器学习---k-近邻算法实战 一.总结 一句话总结: k临近算法的核心就是:将训练数据映射成k维空间中的点 1.k临近算法怎么解决实际问题? 构建多维空间:每个特征是一维,合起来组成了一个多维空 ...
- Swift 算法实战之路:栈和队列
这期的内容有点剑走偏锋,我们来讨论一下栈和队列.Swift语言中没有内设的栈和队列,很多扩展库中使用Generic Type来实现栈或是队列.笔者觉得最实用的实现方法是使用数组,本期主要内容有: 栈和 ...
- 《机实战》第2章 K近邻算法实战(KNN)
1.准备:使用Python导入数据 1.创建kNN.py文件,并在其中增加下面的代码: from numpy import * #导入科学计算包 import operator #运算符模块,k近邻算 ...
- KNN 算法-实战篇-如何识别手写数字
公号:码农充电站pro 主页:https://codeshellme.github.io 上篇文章介绍了KNN 算法的原理,今天来介绍如何使用KNN 算法识别手写数字? 1,手写数字数据集 手写数字数 ...
- SVM 支持向量机算法-实战篇
公号:码农充电站pro 主页:https://codeshellme.github.io 上一篇介绍了 SVM 的原理和一些基本概念,本篇来介绍如何用 SVM 处理实际问题. 1,SVM 的实现 SV ...
- Swift 算法实战之路:基本语法与技巧
Swift是苹果新推出的编程语言,也是苹果首个开源语言.相比于原来的Objective-C,Swift要更轻便和灵活.笔者最近使用Swift实践了大量的算法(绝大部分是硅谷各大公司的面试题),将心得体 ...
- 《算法实战策略》-chaper19-队列、栈和双端队列
对于计算机专业的学生来说,他们一定会很熟悉一句话:程序设计 = 算法 + 数据结构.而根据笔者的理解,所谓程序设计其实就是为了编程解决实际问题,所谓算法是一种解决问题某种思维的方法,但是思维需要得到编 ...
- android 中文件加密 解密 算法实战
现在项目里面有一个需求,本项目里面下载的视频和文档都不允许通过其他的播放器播放,在培训机构里面这样的需求很多.防止有人交一份钱,把所有的课件就拷给了别人.这样的事情培训机构肯定是不愿意的.现在我项目里 ...
随机推荐
- nyoj222 整数中的1 数位DP
从a枚举到b是一定会超时的.此题应该考虑数位dp,也可以理解为递推,假设给定数n,就能在O(32)复杂度算出所有小于等于n的数中1出现的次数,那么给定区间[a, b],solve(b) - solve ...
- js中reduce()用法
reduce()方法 定义:reduce()接收一个函数作为累加器,数组中每个值(从左到右)开始缩减,最终计算为一个值 对于空数组不执行回调函数 语法:array.reduce(function(to ...
- 注意Vietnamese_CI_AS排序规则下的特殊字符大小敏感问题
注意Vietnamese_CI_AS排序规则下的特殊字符大小敏感问题 最近,在SQL Server中遇到了Vietnamese_CI_AS排序规则的特殊字符的大小写敏感问题,是的,你没有看错,这句 ...
- MySQL ODBC 3.51 Driver - Access Denied
MySQL ODBC 3.51 Driver - Access Denied 同事反馈在应用服务器上配置MySQL ODBC 3.51 Drive时,测试连接MySQL数据库时报下面错误: ERR ...
- 使用ffserver实现转发实时流媒体(摄像头捕获)
本系统为ubuntu 10.04LTS 说明1:本实验在本机成功测试通过: 说明2:本实验仅仅测试了视频流,未测试音频流. 1.配置ffserver.conf -------------------- ...
- Linux显示内存统计最大和最小的详情
Linux显示内存统计最大和最小的详情 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ free -l total used free shared buffe ...
- INF 右键安装驱动以及卸载
INF 右键安装驱动以及卸载 之前写过一篇文章是关于INF文件详解的,大家可以参看INF文件详解,这次写的是关于INF右键安装,这样比较方便.卸载的话也是一句话,可以大大减少安装时间: 先将INF文件 ...
- HTML中设置背景图的两种方式
HTML中设置背景图的两种方式 1.background background:url(images/search.png) no-repeat top; 2.background-image ...
- org.hibernate.MappingException
1.错误描述 org.springframework.beans.factory.BeanCreationException:Error creating bean with name 'sessio ...
- JavaScript设计模式(4)-桥接模式
桥接模式 在设计一个 Js API 时,可用来弱化它与使用它的类和对象之间的耦合 1. 事件监听器的回调函数 function getBeerById(id, callback) { asyncReq ...