`
willvvv
  • 浏览: 328858 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Hash散列及冲突解决

阅读更多

先看看英文的维基百科上的解释:

 

A hash function is any algorithm or subroutine that maps large data sets of variable length, called keys, to smaller data sets of a fixed length. For example, a person's name, having a variable length, could be hashed to a single integer. The values returned by a hash function are called hash values, hash codes, hash sums, checksums or simply hashes.

 

意思是说:hash散列是任何可以把大数据集映射到定长数据集的算法或子程序。

用数学公式解释:假设F是一个包含n个记录的文件空间,Ri为文件中的某个记录(1≤i≤n),keyi是其关键字值,若存在关键字值keyi与记录Ri的地址之间建立某种函数关系,则便可以通过这个函数把关键字值转换成相应记录在文件中的地址。即有:addr(Ri)=H(keyi),其中addr(Ri)为Ri的地址,H(keyi)称为哈希函数。

 

hash散列的应用:

 

1.hashtable:用来快速定位一条记录是否出现在给定集合中。

2.加密:hash算法一般是不可逆的。

3.Bloom filters:构造很大的bit数组,利用多个hash算法,判断一条记录是否已存在。用于邮件的黑名单过滤等。

4.校验:如循环冗余校验等。

5.语言识别和文件比较。

 

常用的著名hash算法:

算法名称 输出大小 (bits) 内部大小 区块大小 长度大小 字符尺寸 碰撞情形
HAVAL 256/224/192/160/128 256 1024 64 32
MD2 128 384 128 No 8 大多数
MD4 128 128 512 64 32
MD5 128 128 512 64 32
PANAMA 256 8736 256 32
RadioGatún Arbitrarily long 58 words 3 words 1-64
RIPEMD 128 128 512 64 32
RIPEMD-128/256 128/256 128/256 512 64 32
RIPEMD-160/320 160/320 160/320 512 64 32
SHA-0 160 160 512 64 32
SHA-1 160 160 512 64 32 有缺陷
SHA-256/224 256/224 256 512 64 32
SHA-512/384 512/384 512 1024 128 64
Tiger(2)-192/160/128 192/160/128 192 512 64 64
WHIRLPOOL 512 512 512 256 8

自己如何实现hash算法?

 

1.直接地址法:取关键字或关键字的某个线性函数值为哈希地址。即:H(key)=key或H(key)=a·key+b

2.数字分析法:假设关键字是以R为基的数(如2,8,10等),并且哈希表中可能出现的关键字都是事先知道的,则可以取关键字的若干数位来组成哈希地址。

3.平方取中法:有时一组关键字在每一位上某些数字的重复出现频率很高,例如:(0100,1100,1200,1160,2060,2163,2261,2262),这时无法是用数字分析法得到较均匀的哈希函数,平方取中法是首先求关键字的平方值,通过平方来扩大差别,然后再选其中的几位或其组合作为哈希地址。该方法适用于关键字位数少而相同的位数多的关键字。

4.折叠法(边界法)与转移法:有时关键字含位数较多,这时可将关键字值从某些地方断开,分成几段,其中一段的长度等于地址的位数,把其余折叠加到它的上面,若产生进位则舍去。

5.除留余数法:取关键字被某个不大于哈希表表长m的数p除后所得的余数作为哈希地址。即:H(key)=key MOD p  (p≤m 一般取p为不大于m的最大素数。)

 

 

如何解决hash冲突?

因为是将无限大量的数据集映射到固定长度的数据集上,难免不同的key映射到同一个位置。

 

1.开放定址法

   Hi=(H(key)+di) mod  m  i=1,2,……,k(k≤m-1)

   其中:H(key)为哈希函数;m为哈希表表长;di为增量序列,有三种取法。

①di=1,2,……,m-1;称为线性探测再散列或线性探查法。

②di=12,-12,22,-22,32,……,±k2,(k≤m/2);称为二次探测再散列。

③di=伪随机数序列,称为伪随机探测再散列

 

2.再哈希法

    Hi=RHi(key)     i=1,2,……,k

    RHi均是不同的哈希函数,即在同义词产生地址冲突时计算另一个哈希函数地址,直到冲突不再发生。这种方法不易产生聚集,但增加了计算的时间。

 

3.链地址法(结合的同义词子表)

    把具有相同散列地址的关键字存放在同一个链表中,称为同义词表。同时用数组T存放各个链表的头指针。凡是散列地址为i的记录都以结点方式插入到以T[i]为头指针的单链表中。

 

4.建立一个公共的溢出区(分离的同义词子表)

    假设哈希函数的值域为[0、、m-1],则设向量HashTable[0、、m-1]为基本表,每个分量存放一个记录,另设立向量OverTable[0、、v]为溢出表。所有关键字和基本表中关键字为同义词的记录,不管它们由哈希函数得到的哈希地址是什么,一旦发生冲突,都填入溢出表。


参考:

http://en.wikipedia.org/wiki/Hash_function

http://blog.sina.com.cn/s/blog_4acd74e80100063n.html

分享到:
评论

相关推荐

    用二次探测再散列法解决冲突建立哈希表并查找

     (2)从键盘读入待查找的权重数值,以除留余数法为哈希函数,二次探测再散列法解决冲突建立哈希表,基于哈希算法从数组中查找相应的记录,计算相应的查找时间,并在屏幕上输出显示。(提示:当前计算机时间 函数 C\...

    Hash表存储数据,用再散列来解决地址冲突问题,计算平均查找长度,还可以通过Key值查找对应的value

    散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。

    temporal-hash:时间散列可以解析为单个散列,冲突由时间处理(后来获胜)

    时间哈希update(hash, timestamp) hash - 要添加到时间散列的数据时间戳 - 可选默认为Date.now()resolve() 按时间升序深度合并所有哈希并返回结果。compact(timestamp) 时间戳 - 可选默认为Date.now() 与resolve()...

    哈希函数的应用(数据结构课程设计)

    1.给定一关键字序列,用除留余数法构造hash函数,用线性探测再散列解决冲突构造hash表; 2.给定一个关键字进行查找,返回其位序(如不存在返回0值);

    Hash:最快的 32 位和 64 位散列函数

    这里是高度优化的 32 位和 64 位 Fnv-1a 散列函数。 这个实现比本地 Go 实现快,而且这个特定的算法在以非常高的速度执行时几乎没有冲突。 从我的 5,000,000 个单词(仅 az,每个 3-20 字节)的字典中,32 位哈希...

    aHash 是一种使用 AES 硬件指令的非加密哈希算法_rust_代码_下载

    具体来说,aHash 不适用于网络使用或持久散列值的应用程序。(在这些情况下HighwayHash会是更好的选择) 此外,aHash 并非旨在加密安全,不应用作 MAC 或任何需要加密安全哈希的地方。(在这些情况下SHA-3会是更

    希哈查找函数

    使用哈希函数:H(k)=3*k MOD length,并采用开放定址法处理冲突。试对输入的关键字序列构造哈希表,哈希表长度为length,求等概率情况下查找成功的平均...本题给出部分代码,请补全Hash函数和解决冲突的collison函数。

    08_python_Hash Table

    文章目录概念散列完美散列函数函数库hashlib完美散列函数用途最酷应用:区块链技术散列函数设计冲突解决方案映射抽象数据类型及Python实现python实现散列算法分析查找总结 概念 散列 散列 散列表是一种数据的集合,...

    C语言哈希查找实例

    应用HASH算法的一个简单例子,包含哈希表的定义、创建、查找的实现,以及通过二次探测再散列解决冲突的冲突解决办法,麻雀虽小,五脏俱全

    HashTable的java实现

    实现了链表法(Chaining)和开放地址寻址(Open Addressing)中的Hash表实现,开放地址寻址采用双重散列解决冲突

    静态与动态查找算法性能比较课程设计

     在Hash查找方法中 散列函数构造方法多种多样 同时对于同一散列函数解决冲突的方法也可以不同 两者是影响查询算法性能的关键因素 对于几种典型的散列函数构造方法 做实验观察 不同的解决冲突方法对查询性能的影响 ...

    C语言实现的Hash表(代码)

    C语言实现的Hash表(代码)。C语言实现的Hash表(代码)。C语言实现的Hash表(代码)。C语言实现的Hash表(代码)。

    利用哈希表进行存储 针对一组数据进行初始化哈希表,可以进行显示哈希表,查找元素,插入元素,删除元素,退出程序操作

    (2)设计思想:哈希函数用除留余数法构造,用线性探测再散列处理冲突。 (3)显示元素:显示已经创建的哈希表。 (4)查找元素:查找哈希表中的元素,分为查找成功和查找不成功。 (5)插入元素:在哈希表中,插入一个元素...

    数据结构课程设计-哈希函数的应用

    1.给定一关键字序列,用除留余数法构造hash函数,用线性探测再散列解决冲突构造hash表; 2.给定一个关键字进行查找,返回其位序(如不存在返回0值);

    数据结构查找文件实验

    数据结构的实验之一,关于查找文件的代码:用除留余数法作为Hash函数,利用线形探测再散列处理冲突,构造Hash表.

    姓名Hash表

    30个中国人姓名拼音,设计Hash表,平均查找长度不超过2,用除留余数法构造,用线性探测再散列,二次探测再散列和链地址法处理冲突。完成建表和查表操作。本人的课程设计作业

    python 获取字符串MD5值方法

    工作中用到了MD5值来进行对文件校验,MD5本身就是一个很出色的算法,一定程度上解决了hash散列的冲突,关于MD5的内容网上也有很多,这里只要是进行一个实验,验证一下文件校验方面的工作,因为习惯使用了python来...

    C++ hash.zip

    散列,散列函数采用除留余数法,解决冲突使用链接法,每个槽的链表为带头结点的双向链表。使用这种方法的关键是选择一个合适的除数m,可以选择m是与2的整数幂不太接近的质数

    JAVA-hash-table.zip_Table_hash_hash table java_java hash 查找_哈希表设

    (1) 建立一个哈希表,哈希函数为除留余数法,处理冲突的方法为线性探测再散列或二次探测再散列。 (2) 往哈希表中依次存入插入多个单词。 (3) 显示哈希表的存储情况。 (4) 计算哈希表的平均查找长度。 (5) ...

    Universal Hashing全域哈希原理与python实现,减少hash冲突/碰撞!

    hash函数y=h(k)y=h(k)y=h(k),把任意长度的输入kkk通过散列算法hhh变换成固定长度的输出yyy,该输出就是散列值1。一种常见的hash函数是y=H(k)=(a⋅k+b)mod  my=H(k)=(a\cdot k+b) \mod my=H(k)=(a⋅k+b)modm,mmm...

Global site tag (gtag.js) - Google Analytics