作者:代号[K] 来源:CSDN 博客 编者注:原标题为《从哈希函数、哈希冲突、开散列出发,一文告诉你哈希思想与哈希表构造到底是什么》
Hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。 今天我们就一起来探索一下,哈希最底层的奥秘。 哈希概念 构造一种储存结构,通过某种函数,使得其元素的储存位置与他的关键码之间能够建立一一映射关系,那么在查找时通过该函数很快找到相应元素。 简言之,就是设定某一固定函数(hashFunc),通过此函数来使插入元素的值与元素位置相对应,往后我们需要查找此元素时就可以通过此函数(hashFunc)找到该值。 哈希函数 散列函数(英语:Hash function)又称散列算法、哈希函数,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。 该函数将数据打乱混合,重新创建一个叫做散列值(hash values,hash codes,hash sums,或hashes)的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表。 哈希函数使得计算出来的地址均匀分布在整个空间。 插入及搜索元素 根据待插入元素的关键码,根据哈希函数计算出其存储位置。 我们用除留余数法的哈希函数进行介绍:例:?现有 1 ,3,4,5,6,9几个数进行储存,将n%10求模运算的结果作为哈希地址进行元素插入。 若想查找某一元素时,则只需要对查找元素进行哈希函数运算,得到其存放地址,就能找到该元素。 哈希冲突 当出现插入一个元素,其根据哈希函数计算出的地址,已经被其他元素占用的情况称为哈希冲突。 如: 为了能更好的识别当前位置是否被占用,我们需要对每个位置进行标记 enum state{EMPTY,FULL,DELETE}; 注意:如果我们要删除某一元素时,不能将其直接删除,如果直接删除,会对当前结构产生影响,导致其他元素的搜索出错,所以当我们要删除一个元素时,需要将其标记为删除,而非空。 开散列 开散列又称链地址法,首先对关键码集合用哈希函数计算哈希地址,当具有相同地址的关键码时,将所有同一地址的元素,通过单链表的形式链接起来,而各链表的头结点存储在哈希表中。 这下,你该了解哈希的思想和哈希表构造了吧?欢迎在评论区和我们分享你的想法! —- 编译者/作者:区块链大本营 玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。 |
从哈希函数出发,一文告诉你哈希思想与哈希表构造到底是什么
2020-03-09 区块链大本营 来源:区块链网络
LOADING...
相关阅读:
- 一文读懂什么是哈希函数 | 比特币中的密码学原理2020-07-15
- 比特币:什么是哈希函数? -密码学家2020-05-07
- 史上最易懂区块链基础系列5——为啥区块链能让公证处消失(哈希函数2020-03-01
- 中科院院士王小云 | 哈希函数是区块链的起源技术 区块链已扩展到供应2019-12-07
- 专访密码学家王小云:破解哈希函数算法,她坚持了 10 年2019-11-18