FNV Hash算法

当我们看到她的时候是不是感觉好高大上,好白富美,女神啊,赶紧撤,哈哈。

什么是Hash算法

Hash算法,直译哈希算法,又名散列算法,是将任意长度的二进制值映射为较短的固定长度的二进制值,这个固定长度的二进制值就是Hash值。换句话说Hash值是一堆数据唯一紧凑的数值表示形式。
这里的“唯一”只是相对于算法上,同一个Hash值不可能存在两个不同的输入值(经过特殊处理的除外,如取模就很容易得到相同的Hash值)。所以Hash算法可以验证数值的完整性,用于快速查找,或者加密算法。

FNV Hash算法

Hash算法有很多种,FNV是其中的一种。FVN的名字由三个发明人的首字母组成(Fowler/Noll/Vo)。FNV有三个版本,分别为FNV-0、FNV-1、FNV-1a,其中FNV-0已经废弃不用,FNV-1与FNV-1a的差别在于计算算法的顺序不同。

算法实现
FNV-1算法

// hash/哈希值,是一个n位的无符号整型数/unsigned int,n为2的x次方,如n=32、n=64...等
hash = offset_basis // offset_basis是哈希初始化值,大小与n有关
for each octet_of_data to be hashed // octet_of_data为计算哈希值的数据的每一字节
    hash = hash * FNV_prime // FNV_prime为质数,大小与n有关(可以包含取模运算,%(2的n次方))
    hash = hash xor octet_of_data // 异或
return hash

FNV-1a算法

// hash/哈希值,是一个n位的无符号整型数/unsigned int,n为2的x次方,如n=32、n=64...等
hash = offset_basis // offset_basis是哈希初始化值,大小与n有关
for each octet_of_data to be hashed // octet_of_data为计算哈希值的数据的每一字节
    hash = hash xor octet_of_data // 顺序与FNV-1a刚好相反,先异或再相乘
    hash = hash * FNV_prime
return hash

在FNV-1与FNV-1a中,变量offset_basis、octet_of_data、FNV_prime的意义都是一样的,他们的区别仅在算法的顺序上。
octet_of_data数据的取值与n有关,下面为取值列表:
32 bit offset_basis = 2166136261
64 bit offset_basis = 14695981039346656037
128 bit offset_basis = 144066263297769815596495629667062367629
256 bit offset_basis =
100029257958052580907070968620625704837092796014241193945225284501741471925557
512 bit offset_basis =
96593031294966694980094354007163104660904187456726378961083743294344626579945829
32197716438449813051892206539805784495328239340083876191928701583869517785
1024 bit offset_basis =
14197795064947621068722070641403218320880622795441933960878474914617582723252296
73230371772215086409652120235554936562817466910857181476047101507614802975596980
40773201576924585630032153049571501574036444603635505054127112859663616102678680
82893823963790439336411086884584107735010676915

FNV_prime数据的取值也与n有关,下面为取值列表:
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 =
35835915874844867368919076489095108449946327955754392558399825615420669938882575
126094039892345713852759
1024 bit FNV_prime = 2680 + 28 + 0x8d =
50164565101131186554345988110352789550307653454047907443030175238311120551081474
51509157692220295382716162651878526895249385292291816524375083746691371804094271
873160484737966720260389217684476157468082573

参考的博客文章:
FNV哈希算法
FNV Hash
以上都是个人笔记 如果有错还望指出 唯有时间了解爱

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值