Hash,通常译作散列、杂凑,或音译为哈希,它是一种将任意长度的输入,即所谓的预映射(pre-image),通过特定的散列算法转化为固定长度输出的过程。这个输出,即散列值,是哈希技术的核心。
今日,让我们共同揭开哈希这一底层技术的神秘面纱。
### 哈希概念 为了构建一种存储结构,我们采用一种函数,使得结构中元素的存储位置与其关键码之间能够建立一种精确的一一映射关系。这样,在查找元素时,便可以借助该函数迅速定位到相应的元素。 简单来说,我们设定一个固定的函数(hashFunc),通过这个函数将元素的值与其在结构中的位置关联起来。未来,当我们需要查找某个元素时,只需通过hashFunc函数即可快速定位到该值。 ### 哈希函数 散列函数(英语:Hash function),亦称散列算法或哈希函数,它是一种从任何类型的数据中生成小数字“指纹”的方法。散列函数将信息或数据压缩成摘要,从而减小数据量并固定数据格式。 该函数通过打乱和混合数据,重新生成一个被称为散列值(hash values,hash codes,hash sums,或hashes)的指纹。通常,散列值用一个短小的随机字母和数字组合的字符串表示。 哈希函数确保计算出的地址在整个空间内分布均匀。 ### 插入及搜索元素 根据待插入元素的关键码,使用哈希函数计算出其存储位置。 以下以除留余数法的哈希函数为例进行介绍: - 例如,现有数字1,3,4,5,6,9等,我们将每个数字对10求模运算的结果作为哈希地址进行元素插入。 若需查找某一元素,只需对查找元素进行哈希函数运算,得到其存放地址,便可找到该元素。 ### 哈希冲突 当插入一个元素时,若其通过哈希函数计算出的地址已被其他元素占用,这种现象称为哈希冲突。 例如: - 为了更好地识别当前位置是否已被占用,我们需要对每个位置进行标记。 ```cpp enum state{EMPTY,FULL,DELETE}; ``` - 注意:若要删除某一元素,不能直接将其删除,否则可能会影响当前结构,导致其他元素的搜索出错。因此,在删除元素时,应将其标记为删除状态,而非直接置为空。 ### 开散列 开散列,又称链地址法,其首先对关键码集合使用哈希函数计算哈希地址。当存在具有相同地址的关键码时,将这些元素通过单链表的形式链接起来,而链表的头结点存储在哈希表中。 至此,您应该对哈希的思想和哈希表的构建有了更深的理解。欢迎在评论区与我们分享您的见解!标签: 数字货币
文章来源: 酷玩网
版权声明: 本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任