`
san_yun
  • 浏览: 2662486 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

hash算法-crc32和fnv

 
阅读更多

 

memcache.hash_strategy = “standard”;
控制将key映射到server的散列函数。默认值”crc32″使用CRC32算法,而”fnv”则表示使用FNV-1a算法。 FNV-1a比CRC32速度稍低,但是散列效果更好。

 

市面上的哈希算法应该有很多种。FNV是第一种我真正接触哈希算法,算法简单。

简单介绍一下(其实就是翻译一下,汗!):

  FNV哈希函数,有三种FNV-0(已废弃),FNV-1, FNV-1a。

  FNV-1和FNV-1a算法对于最终生成的哈希值(hash)有一定限制

  1,hash是无符号整型

  2,hash的位数(bits),应该是2的n次方(32,64,128,256,512,1024),一般32位的就够用了。

  FNV-1形式:

hash = offset_basis 
for each octet_of_data to be hashed 
hash = hash * FNV_prime 
hash = hash xor octet_of_data 
 
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-1a代替FNV-1发现算法离散性或CPU利用效率更好(我感觉应该没什么太大差距,只是微小的)。

for each octet_of_data to be hashed 意思是对于你要算哈希值的数,它的每一个字节。

hash = hash * FNV_prime,是包含取模运算的,具体看你采用多少位的哈希函数。例如,你用32为哈希,hash = hash * FNV_prime % (2的32次方);

hash = hash xor octet_of_data,意思是把当前取来的字节和当前的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 =
35835915874844867368919076489095108449946327955754392558399825615420669938882575
126094039892345713852759


1024 bit FNV_prime = 2680 + 28 + 0x8d =
50164565101131186554345988110352789550307653454047907443030175238311120551081474
51509157692220295382716162651878526895249385292291816524375083746691371804094271
873160484737966720260389217684476157468082573

  以上这几个数都是质数(哈希的理论基石,质数分辨定理,我理解也不深),不用管为什么,用的时候照搬就是了。

 

 如果我想得到的哈希位数不是上面几种呢?

  比如我想得到24位的哈希值,方法:取上面比24大的最小的位数,当然是32了,先算对应32位哈希值,再转换成24位的。

  转换方法:32 - 24 = 8, 好了把得到的32砍成两段,高8位最和低24位。第8位与低24位中的低8位做抑或,得到的24位值是最终结果。(hash >>24) ^ (hash & 0xFFFFFF);
 如果我想得到的哈希值不能用位数来表示呢?

  比如想得到范围在0~9999的哈希值,方法:取上面比9999大的最小的位数,当然是32,先算对应32位哈希值,再mod(9999 +1)。简单吧!!

  其实还有一种方法,可以避免上面方法出现的某些问题(映射分布有点儿不均匀,这个问题在一般情况下不用考虑,所以方法也不介绍了,有兴趣可以去网站上看看)。

【英文参考】

http://www.isthe.com/chongo/tech/comp/fnv/index.html

分享到:
评论

相关推荐

    MD5-SHA1-CRC32-Hash计算

    MD5、SHA1和CRC32是三种常见的散列(Hash)函数,它们在信息安全、数据完整性验证和软件校验等方面发挥着重要作用。这个名为"MD5-SHA1-CRC32-Hash计算"的小工具提供了快速计算这些散列值的功能,对于文件校验和管理...

    fnv1a:64位Fnv-1a哈希模块

    很好地证明了我实际上可以编写一些OOP(大多数时候我只是选择不这样做),我将基于64位的FNV-1a散列算法(基于类,对象和实例以及所有这些废话)嵌入了一个python模块。 这是完全没有用的和荒谬的,没有任何意义,...

    SPlayer视频文件hash算法 - Google Docs.rar_HASH播放器_HASH特征码_HASH算法_hash播

    标题中的"SPlayer视频文件hash算法"指的是射手播放器(SPlayer)用于识别和验证视频文件的一种特定技术。这种算法能够生成一个唯一哈希值(hash value),也称为特征码,来表示文件的内容。哈希算法在信息技术中广泛...

    文件校验工具 CRC32 MD5 HASH校验码自动计算工具

    在给定的“文件校验工具 CRC32 MD5 HASH校验码自动计算工具”中,我们主要关注三种常见的校验技术:CRC32、MD5和HASH。 1. CRC32(Cyclic Redundancy Check 32): CRC32是一种广泛使用的错误检测方法,通过计算...

    Modbus-CRC16_CRC8超级无敌工具.zip

    CRC校验支持:CRC3、CRC4、CRC5、CRC6、CRC7、CRC8、CRC11、CRC12、CRC13、CRC14、CRC15、CRC16、CRC17、CRC21、CRC24、 CRC30、CRC31、CRC32、CRC40、CRC64全面的CRC算法,支持显示标准的多项式

    CRC32 MD5 SHA HASH算法源码库

    开源的HASH算法源码, ...支持算法:CRC-16, CRC-16-CCITT, CRC-32, FCS-16, FCS-32, GHash-32-3, GHash-32-5, GOST-Hash, HAVAL-5-256, MD2, MD4, MD5, SHA-1, SHA-256, SHA-384, SHA-512, Tiger 支持VC6下编译通过

    各种hash算法-hashcodeUtil

    MD5(Message-Digest Algorithm 5)和SHA(Secure Hash Algorithm)家族是常见的哈希算法,如SHA-1、SHA-256等。这些算法产生固定长度的哈希值,具有抗碰撞(即相同的输入产生不同的输出)的特性。然而,随着计算...

    php-crc32:PHP CRC32实现(支持所有crc32多项式和硬件加速)

    根据环境和多项式, CRC32::create将选择最快的可用版本,并返回以下类之一: Google\CRC32\PHP一个纯PHP实现。 Google\CRC32\Builtin一个实现。 Google\CRC32\Google 硬件加速的实现(使用 )。

    qt-crc32:Qt 的 CRC32 支持

    CRC32(Cyclic Redundancy Check,循环...Qt提供的CRC32支持使得这一过程变得简单且直观,无需深入理解CRC32算法的底层细节。通过结合`QByteArray`和`QChecksum`类,开发者可以方便地实现数据校验,提高程序的健壮性。

    node-crc32c:适用于Linux的crc32c(Castagnoli)实现的NodeJS基本C模块。 支持字符串,字符串对象和缓冲区!

    它与节点0.10和0.11兼容! 它支持字符串,字符串对象,缓冲区,数字! 与猫鼬搭配使用效果很好。 只需在实体上执行toString即可哈希! 该模块不是用于安全哈希的,而是用于诸如ETags之类的东西,或者是使用哈希比...

    最快的排序算法 计算机最快的算法-史上14个最快速算法:孩子的计算能力爆表!大脑堪比计算机!...,排序算法数据结构

    在计算机科学领域中,排序算法是一种基本的算法,它可以将数据按照一定的顺序排列,以便更好地存储、检索和处理数据。排序算法的速度和效率对程序的性能有着至关重要的影响。 1.冒泡排序算法 冒泡排序算法是一种...

    looly#hutool-site#Hash算法-HashUtil1

    介绍HashUtil其实是一个hash算法的集合,此工具类中融合了各种hash算法。方法这些算法包括:additiveHash 加法hashrotatingHa

    最快的排序算法 最快的内容查找算法-----暴雪的Hash算法,排序算法数据结构

    该算法的核心思想是使用一个循环来计算字符串的哈希值,循环中使用了两个种子数seed1和seed2,通过对字符串的每个字符进行toupper操作,并将其与seed1和seed2进行异或运算,最后返回seed1作为哈希值。 Hash算法的...

    数据结构和算法-思维导图.pdf

    在数据结构和算法领域中,存在大量不同的概念和术语,这些都构成了计算机科学的基础。思维导图是一种有效的方式来组织和回顾这些概念,通过可视化方式帮助记忆和理解。从提供的文件【标题】:"数据结构和算法-思维...

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

    MurmurHash算法由Austin Appleby创建于2008年,现已应用到Hadoop、libstdc 、nginx、libmemcached,Redis,Memcached,Cassandra,HBase,Lucene等开源系统。2011年Appleby被Google雇佣,随后Google推出其变种的...

    python_geohash-0.8.5-cp36-cp36m-win32

    python_geohash-0.8.5-cp36-cp36m-win32

    常用的hash算法(java实现)

    CRC32不是一种安全的哈希算法,但因其快速和简单,常用于检查数据传输错误。在Java中,`java.util.zip.CRC32`类提供了CRC32的实现: ```java import java.util.zip.CRC32; public class CRC32Example { ...

    ORACLE CRC32函数

    在Oracle数据库中,`CRC32`函数是一种非常实用的功能,主要用于将字符类型的数据转换为一个唯一的数字类型,这一过程通常被称为散列(Hash)。通过该函数,可以方便地生成针对特定字符串的固定长度的数字签名,这...

    FNV-1a:Go语言中的FNV-1a哈希算法

    要使用Go语言中的FNV-1a哈希算法,首先需要导入`hash/fnv`包。这个包包含了FNV-1a的不同版本。例如,如果我们想要计算一个字符串的64位哈希值,可以这样做: ```go package main import ( "crypto/md5" "fmt" ...

    Hash V1.04 MD5 SHA1 CRC32 校验工具

    Hash V1.04是一款功能强大的校验工具,它支持MD5、SHA1以及CRC32三种常见的校验算法,为用户提供了便捷且高效的方式来检查文件的完整性。 MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,可将任意...

Global site tag (gtag.js) - Google Analytics