hash算法fnv

  • FNV哈希算法 取自于1991年Glenn Fowler和 Phong Vo向IEEE POSIX P1003.2委员会发送评论者意见的想法 。在随后的投票中: Landon Curt Noll 对他们的算法进行了改进。一些人尝试了此哈希,发现它工作得很好。在发给 Landon的电子邮件中,他们将其命名为`` Fowler / Noll / Vo ''或FNV哈希

  • FNV哈希被设计为快速,同时保持较低的冲突率。该 FNV速度允许一个快速散列大量的数据,同时保持合理的碰撞率。FNV散列的高度分散性使其非常适合散列几乎相同的字符串,例如URL,主机名,文件名,文本,IP地址等

fnv版本

  • FNV
  • FNV-1
  • FNV-1a

FNV-1a 算法公式

hash = offset_basis
for each octet_of_data to be hashedhash = hash xor octet_of_datahash = hash * FNV_prime
return hash

其与FNV-1算法的区别就是异或运算与乘法运算顺序调整了,即是说FNV-1算法是先进行乘法运算再进行异或运算

参数说明

  1. offset_basis 参数依赖于hash位数的大小
  • 32 bit offset_basis = 2166136261

  • 64 bit offset_basis = 14695981039346656037

  • 128 bit offset_basis = 144066263297769815596495629667062367629

  • 256 bit offset_basis =
    100029257958052580907070968620625704837092796014241193945225284501741471925557

  • 512 bit offset_basis =
    9659303129496669498009435400716310466090418745672637896108374329434462657994582932197716438449813051892206539805784495328239340083876191928701583869517785

  • 1024 bit offset_basis =
    14197795064947621068722070641403218320880622795441933960878474914617582723252296732303717722150864096521202355549365628174669108571814760471015076148029755969804077320157692458563003215304957150157403644460363550505412711285966361610267868082893823963790439336411086884584107735010676915

  • offset_basis 计算脚本

hash_bits = insert_the_hash_size_in_bits_here;
FNV_prime = insert_the_FNV_prime_here;
offset_basis = 0;
offset_str = “chongo /\…/\”;
hash_mod = 2hash_bits;
str_len = strlen(offset_str);
for (i=1; i <= str_len; ++i) {
offset_basis = (offset_basis * FNV_prime) % hash_mod;
offset_basis = xor(offset_basis, ord(substr(offset_str,i,1)));
}
//输出
print hash_bits, “bit offset_basis =”, offset_basis;

  1. FNV_prime参数依赖于hash位数的大小
  • 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
  • 1024 bit FNV_prime = 2680 + 28 + 0x8d =
    5016456510113118655434598811035278955030765345404790744303017523831112055108147451509157692220295382716162651878526895249385292291816524375083746691371804094271873160484737966720260389217684476157468082573
  1. octet_of_data 8位元数据或者单个字节数据

伪代码实现

 /*** 这里的值跟2166136261等价,因为int大小越界调整为16进制表示*/private final static int offset_basis_32 = 0x811c9dc5; private final static int FNV_prime_32 = 16777619;/*** * @param str* @return*/public static int hash(String str) {char[] chrs = str.toCharArray();int hash = offset_basis_32;for(int i=0;i<chrs.length;i++) {hash ^= chrs[i];hash *= FNV_prime_32;//乘法运算更快一点//hash += (hash<<1) + (hash<<4) + (hash<<7) + (hash<<8) + (hash<<24); //将上面的乘法运算改为移位和运算}return Math.abs(hash);}/*** 获取限定长度的hash* 注意长度大小* @param str 初始字符串* @param len hash位数* @return*/public static int hashOfLen(String str,int len) {int hash = hash(str);hash = (hash >> len) ^ ( hash & ( (1<<len)-1 ) );return hash;}/*** 获取限定最大的值的hash* @param str 初始字符串* @param max hash最大值* @return*/public static int hashOfMax(String str,int max) {int hash = hash(str) % (max+1);return hash;}

特别注意的地方。

  • 按照长度缩小。基准值应选择大于当前值最接近的位数,例如你需要16位的长度,选择32位,需要54位长度 选择64位
  • 同理按照大小缩小也一样。如果选择最大值为99999,则选择32位 因为232 > 99999,如果选择最大值为3000000000,则选择64位 因为264 > 3000000000

hash算法Fnv-1a相关推荐

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

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

  2. 转 常见hash算法的原理

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

  3. hash的算法 java_【数据结构与算法】一致性Hash算法及Java实践

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

  4. 几种经典的hash算法

    计算理论中,没有Hash函数的说法,只有单向函数的说法.所谓的单向函数,是一个复杂的定义,大家可以去看计算理论或者密码学方面的数据.用"人 类"的语言描述单向函数就是:如果某个函数 ...

  5. Hash算法大全(java实现)

    http://www.java3z.com/cwbwebhome/article/article5/51002.html Hash算法有很多很多种类.具体的可以参考之前我写的Hash算法的一些分析.本 ...

  6. java常见的hash算法_常见的哈希算法和用途

    写在前面 哈希算法经常会被用到,比如我们Go里面的map,Java的HashMap,目前最流行的缓存Redis都大量用到了哈希算法.它们支持把很多类型的数据进行哈希计算,我们实际使用的时候并不用考虑哈 ...

  7. Java之——Hash算法大全

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/54573106 实际工作过程中,要用到各种各样的Hash算法,今天就给大家带来一篇基 ...

  8. 常见的哈希Hash算法 MD5 对称非对称加密 海明码

    2019独角兽企业重金招聘Python工程师标准>>> 参考 Link 另外,这篇文章也提到了利用Hash碰撞而产生DOS攻击的案例: http://www.cnblogs.com/ ...

  9. 一致性Hash算法及Java实践

    目录 一.案例背景 1.1 系统简介 1.2 遇到问题 1.3 初步优化 1.4 继续优化 二.使用一致性Hash解决问题 三.一致性Hash介绍 3.1 理论简介 3.2 设计实现 四.对一致性Ha ...

最新文章

  1. 想象力比知识更重要——专访首位吴文俊人工智能最高成就奖得主陆汝钤
  2. mysql对本地文件的读取_Mysql 任意读取客户端文件
  3. SQL Server常用函数 -- 更新中
  4. 编译安装LNMP全程实录
  5. android游戏渠道支付,Android渠道支付隐患及推荐解决方案
  6. win10java配置环境变量msi_Windows10+eclipse+hadoop2.7.1环境配置+wordcount-折腾笔记
  7. 零基础带你学习MySQL—多表查询笛卡尔集(二十)
  8. No converter found capable of converting from type
  9. PHP+MYSQL+AJAX实现每日签到功能
  10. 从高考落榜生到网络专家
  11. WIN7封装教程2018系列(二)—必要的系统调整
  12. php实现给pdf加水印,pdf文件如何加水印 怎样给pdf文件加水印|帮你轻松实现给pdf加水印...
  13. 工单、工艺路线及工作中心的表结构
  14. 学生网页作业:商城网站设计——仿天猫商城(9页) HTML+CSS大作业_ 网页制作作业_疫情防控网页设计...
  15. Python基础语法学习6
  16. python判断三角形程序_python三角形判定怎么做
  17. Ubuntu16.04搜索不到wifi
  18. Django 使用QSL server数据库
  19. C#中 MD5加密,解密
  20. vba 怎么取得一个book中最右边的sheet名_在阴影中一心前进 | 安藤忠雄:艰难的日子里坚韧地活...

热门文章

  1. 苹果在2007年推出了最初的苹果电视机顶盒产品
  2. wince6.0桌面背景+设置默认IP+开机自动运行程序
  3. uniapp app 实现长按文字实现复制
  4. JetPack Compose简单介绍
  5. JavaScript trim() 方法
  6. template详解
  7. iterm php,iterm2使用
  8. 怎么将太大的word文档压缩变小,3个高效方法
  9. find命令报错: paths must precede expression(转)
  10. 标记语言、脚本语言和编程语言的含义和比较