先看看英文的维基百科上的解释:
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算法:
自己如何实现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 table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。
时间哈希update(hash, timestamp) hash - 要添加到时间散列的数据时间戳 - 可选默认为Date.now()resolve() 按时间升序深度合并所有哈希并返回结果。compact(timestamp) 时间戳 - 可选默认为Date.now() 与resolve()...
1.给定一关键字序列,用除留余数法构造hash函数,用线性探测再散列解决冲突构造hash表; 2.给定一个关键字进行查找,返回其位序(如不存在返回0值);
这里是高度优化的 32 位和 64 位 Fnv-1a 散列函数。 这个实现比本地 Go 实现快,而且这个特定的算法在以非常高的速度执行时几乎没有冲突。 从我的 5,000,000 个单词(仅 az,每个 3-20 字节)的字典中,32 位哈希...
具体来说,aHash 不适用于网络使用或持久散列值的应用程序。(在这些情况下HighwayHash会是更好的选择) 此外,aHash 并非旨在加密安全,不应用作 MAC 或任何需要加密安全哈希的地方。(在这些情况下SHA-3会是更
使用哈希函数:H(k)=3*k MOD length,并采用开放定址法处理冲突。试对输入的关键字序列构造哈希表,哈希表长度为length,求等概率情况下查找成功的平均...本题给出部分代码,请补全Hash函数和解决冲突的collison函数。
文章目录概念散列完美散列函数函数库hashlib完美散列函数用途最酷应用:区块链技术散列函数设计冲突解决方案映射抽象数据类型及Python实现python实现散列算法分析查找总结 概念 散列 散列 散列表是一种数据的集合,...
应用HASH算法的一个简单例子,包含哈希表的定义、创建、查找的实现,以及通过二次探测再散列解决冲突的冲突解决办法,麻雀虽小,五脏俱全
实现了链表法(Chaining)和开放地址寻址(Open Addressing)中的Hash表实现,开放地址寻址采用双重散列解决冲突
在Hash查找方法中 散列函数构造方法多种多样 同时对于同一散列函数解决冲突的方法也可以不同 两者是影响查询算法性能的关键因素 对于几种典型的散列函数构造方法 做实验观察 不同的解决冲突方法对查询性能的影响 ...
C语言实现的Hash表(代码)。C语言实现的Hash表(代码)。C语言实现的Hash表(代码)。C语言实现的Hash表(代码)。
(2)设计思想:哈希函数用除留余数法构造,用线性探测再散列处理冲突。 (3)显示元素:显示已经创建的哈希表。 (4)查找元素:查找哈希表中的元素,分为查找成功和查找不成功。 (5)插入元素:在哈希表中,插入一个元素...
1.给定一关键字序列,用除留余数法构造hash函数,用线性探测再散列解决冲突构造hash表; 2.给定一个关键字进行查找,返回其位序(如不存在返回0值);
数据结构的实验之一,关于查找文件的代码:用除留余数法作为Hash函数,利用线形探测再散列处理冲突,构造Hash表.
30个中国人姓名拼音,设计Hash表,平均查找长度不超过2,用除留余数法构造,用线性探测再散列,二次探测再散列和链地址法处理冲突。完成建表和查表操作。本人的课程设计作业
工作中用到了MD5值来进行对文件校验,MD5本身就是一个很出色的算法,一定程度上解决了hash散列的冲突,关于MD5的内容网上也有很多,这里只要是进行一个实验,验证一下文件校验方面的工作,因为习惯使用了python来...
散列,散列函数采用除留余数法,解决冲突使用链接法,每个槽的链表为带头结点的双向链表。使用这种方法的关键是选择一个合适的除数m,可以选择m是与2的整数幂不太接近的质数
(1) 建立一个哈希表,哈希函数为除留余数法,处理冲突的方法为线性探测再散列或二次探测再散列。 (2) 往哈希表中依次存入插入多个单词。 (3) 显示哈希表的存储情况。 (4) 计算哈希表的平均查找长度。 (5) ...
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...