`
willvvv
  • 浏览: 333367 次
  • 性别: 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

分享到:
评论

相关推荐

    两种方法实现Hash散列

    冲突处理是Hash散列中的一个重要环节,常见的处理方法有开放寻址法、链地址法和再哈希法等。 对于kmod29方法,这里的“kmod29”可能是指取模运算,也就是使用除以29并取余的方式来确定键的哈希值。这意味着哈希函数...

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

    在这个任务中,我们采用二次探测再散列法来解决哈希冲突。 二次探测再散列法是一种解决哈希冲突的方法,当一个元素的哈希地址已经被其他元素占用时,我们不会立即跳到下一个地址,而是按照平方序列(如 1, 4, 9, .....

    Hash散列函数——二次探查以及链式探查实现

    在IT领域,数据结构是...总之,散列函数和冲突解决策略是数据结构中的重要组成部分,它们对于优化程序性能和数据管理具有深远影响。理解并熟练运用这些概念,无论是进行软件开发还是数据分析,都能显著提升工作效率。

    Hash函数与冲突解决办法

    《Hash表的构建和冲突解决》文档可能详细介绍了如何构建哈希表、各种哈希函数的设计思路,以及在实际编程中如何运用这些方法来有效地解决冲突。可能涉及的具体内容包括: - 哈希表的基本结构和操作(如插入、删除、...

    数据结构C语言实现散列:创建、解决冲突、查找元素[文].pdf

    在本文档中,我们探讨了如何使用C语言实现数据结构中的散列,特别是涉及创建散列表、解决冲突以及查找元素。散列是一种高效的数据存储和检索方法,它通过散列函数将键(key)映射到一个固定大小的数组(散列表)中的...

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

    通过一次哈希运算,可以快速定位到数据的潜在位置,如果发生冲突,再通过冲突解决策略找到确切的元素。哈希查找的速度远快于传统的顺序查找和二分查找,尤其在大数据量的情况下,优势更为明显。 总的来说,哈希表是...

    哈希表相关概念、hash函数、hash冲突解决方案、代码示例

    2. **再散列函数法**:使用第二个或更多的哈希函数来重新计算哈希值,减少冲突的可能性。这种方法增加了计算复杂性,但能有效地分散数据。 3. **链地址法**:在每个哈希表的槽位上附加一个链表,所有映射到同一位置...

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

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

    Hash表法实现散列以及再散列

    常见的解决冲突策略有开放寻址法、链地址法和双哈希法。在C++实现中,链地址法常被采用,即在每个数组元素处存储一个链表,遇到冲突的键值就将其添加到对应的链表中。这种方法简单易懂,但会增加额外的内存开销。 ...

    Hash-lookup.zip_hash冲突

    在“Hash-lookup.zip_hash冲突”这个主题中,我们主要探讨的是在使用哈希表进行查找时遇到的冲突问题以及解决策略。 哈希函数是哈希查找的核心,它的作用是将任意长度的关键字映射到固定大小的哈希表(也称为散列表...

    hash散列表的三种实现

    - 冲突解决策略:根据实际情况选择合适的冲突解决方法,如链地址法、线性探测法或双重散列表。 - 扩展性:考虑哈希表在数据量增大时的扩展策略,如动态扩容。 - 空间效率:合理利用内存,避免浪费,尤其是在使用链...

    散列表之链接法解决冲突

    散列表(Hash Table)是一种数据结构,用于存储键值对,通过特定的散列函数将键(Key)转化为数组索引,实现快速访问。在实际应用中,由于散列函数的不完美,不同键可能会被映射到相同的索引位置,这种现象称为...

    如何解决hash冲突

    解决哈希冲突的方法多种多样,下面我们将深入探讨其中的四种主要策略:开放地址法、再哈希法、链地址法以及公共溢出区。 1. 开放地址法: 开放地址法的基本思想是在发生冲突时寻找下一个空的哈希地址。具体实现...

    哈希查找数据结构实验报告.pdf

    哈希函数的实现使用除留余数法,二次探测再散列解决冲突使用开放地址的二次探测再散列。哈希表的创建使用 creat 函数,查找哈希表使用 search 函数。 本实验报告详细介绍了哈希表的造表和查找算法的实现,包括需求...

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

    综上所述,C语言实现的Hash表涉及了哈希函数设计、冲突解决策略、结构体定义及基本操作的实现。在实际编程中,还需要考虑内存管理、性能优化等方面,以确保Hash表的高效运行。通过理解这些概念并结合C语言的特性,...

    常用的hash算法(java实现)

    在计算机科学中,哈希(Hash)算法是一种用于将任意长度...在实际应用中,选择合适的哈希算法取决于具体需求,如速度、安全性、哈希冲突概率等。理解并熟练使用这些哈希算法对于任何Java开发者来说都是非常重要的技能。

    打造最快的Hash表(和Blizzard的对话)

    通过上述分析,我们可以看到Blizzard的Hash表实现不仅体现了对散列技术的深刻理解,而且还展示了如何利用多个散列值来进一步提高Hash表的性能和准确性。这种技术尤其适用于处理大量数据的情况,能够显著减少冲突的...

    VC++2012编程演练数据结构《19》散列文件

    在"19.cpp"文件中,我们可以预期看到散列文件的具体实现代码,包括散列函数的设计、冲突解决策略(如开放寻址法、链地址法)、以及插入和查找操作。可能还会包含一些辅助函数,如计算散列值、判断是否为空、调整数组...

    09-散列1. Hashing (25).zip

    常见的解决冲突的方法有开放寻址法、链地址法和再散列法。开放寻址法是当冲突发生时,寻找下一个空的散列地址;链地址法是在每个散列桶中存储一个链表,所有散列到同一位置的元素都在该链表中;再散列法是使用多个...

Global site tag (gtag.js) - Google Analytics