发布时间:2025-06-24 19:13:59 作者:北方职教升学中心 阅读量:619
灵活性:支持动态数据存储,且键值对可以是任意类型。离散性:尽可能避免不同的输入产生相同的输出(即哈希冲突)。哈希表在现代编程语言中的实现十分广泛,如 C++ 的 std::unordered_map 和 Python 的 dict。
这些特性赋予了哈希算法广泛的适用性,无论是数据存储、雪崩效应:输入的微小变化会显著改变输出。这便是哈希算法(Hashing Algorithm)
,一个将复杂数据映射到简单空间的魔法,它赋予了无序的世界以秩序,将分散的数据安排得井井有条。它们的特点是:- 抗碰撞性:难以找到两个不同输入对应同一输出。
- 不可逆性(特定场景下):某些场景需要保证从哈希值无法反推出原始输入。
- 缓存未命中:如果缓存满了,移除链表尾部的键。
小结
本篇关于哈希算法的介绍就暂告段落啦,希望能对大家的学习产生帮助,欢迎各位佬前来支持斧正!!!

查找操作:定位到桶后,遍历桶内的链表查找目标键。3.2 基本的哈希表实现
哈希表是一种数据结构,通过哈希函数快速定位存储值。
第二章:经典哈希函数——一座算法的博物馆
哈希算法的发展历程中,涌现出许多经典的哈希函数,每一种都为不同的场景提供了解决方案:
简单哈希函数:
最简单的哈希函数基于数学取模(Modulo)的方式,例如:
h(x)=x mod m
它适用于简单场景,例如将数据均匀分布到固定数量的桶中。
3.1 哈希函数的基本实现
哈希函数的核心目标是将任意输入映射为固定长度的输出值。一个简单的哈希函数示例如下:
#include<iostream>#include<string>usingnamespacestd;intsimpleHash(string key,inttableSize){inthashValue =0;for(charc :key){hashValue +=c;}returnhashValue %tableSize;}intmain(){string key ="hash";inttableSize =10;cout <<"Hash value of ""<<key <<"": "<<simpleHash(key,tableSize)<<endl;return0;}
输出:
Hash value of “hash”: 9
代码解释:
- simpleHash 是一个简单的哈希函数,它将字符串中的每个字符的 ASCII 值累加起来。
- 删除(Delete):查找到索引后删除对应的值。
- 链地址法:当两个键映射到同一个索引时,将它们存储在该桶(Bucket)中的链表中,解决哈希冲突。
- 开放地址法:通过线性探测或二次探测寻找空闲位置。
第一章:哈希的本质——化繁为简的魔法
哈希算法的核心思想是将任意长度的数据映射到固定长度的值,称之为哈希值(Hash Value)
或散列值
。以下是一个简单实现:
#include<iostream>#include<unordered_map>#include<list>usingnamespacestd;classLRUCache{private:intcapacity;list<int>keys;unordered_map<int,pair<int,list<int>::iterator>>cache;public:LRUCache(intcap):capacity(cap){}intget(intkey){if(cache.find(key)==cache.end())return-1;keys.erase(cache[key].second);keys.push_front(key);cache[key].second =keys.begin();returncache[key].first;}voidput(intkey,intvalue){if(cache.find(key)!=cache.end()){keys.erase(cache[key].second);}elseif(keys.size()==capacity){intoldKey =keys.back();keys.pop_back();cache.erase(oldKey);}keys.push_front(key);cache[key]={value,keys.begin()};}voiddisplay(){for(intkey :keys){cout <<key <<" ";}cout <<endl;}};intmain(){LRUCache cache(3);cache.put(1,10);cache.put(2,20);cache.put(3,30);cache.display();cache.get(1);cache.display();cache.put(4,40);cache.display();return0;}
输出:
3 2 1
1 3 2
4 1 3
代码解释:
- 哈希表与链表结合:哈希表提供 O(1) 的查找,链表维护键的使用顺序。
3.3 哈希算法的实际应用
哈希表结合链表可以高效实现最近最少使用(LRU)缓存。
- 查找(Search):根据键计算索引,直接定位到存储值的位置。
哈希函数(Hash Function)是实现这一魔法的核心,其关键特性包括:
- 确定性:相同的输入总能生成相同的输出。加密安全还是网络协议,哈希算法无处不在。然而,对于复杂的数据,这种方法可能导致大量冲突。
哈希表的操作:
- 插入(Insert):通过哈希函数计算键的索引,将值存入数组。
- 缓存命中:如果键存在,将其移动到链表头部。这是一个将键(Key)与值(Value)关联的数据结构,它通过哈希函数将键映射到数组的索引,实现快速的数据存取。本文将带你走入哈希算法的奇妙国度,探究它的原理、数字签名和区块链技术。
- 插入操作:通过哈希函数计算键的索引,将键插入到对应桶中。
第三章:哈希表的奇迹——从无序到有序的转变
哈希算法最典型的应用场景是哈希表(Hash Table)。
在分布式场景下采用一致性哈希,平衡节点数据。加密哈希算法(Cryptographic Hash Functions):
如 MD5、以下是一个简单的哈希表插入和查找实现:
#include<iostream>#include<vector>#include<list>#include<string>usingnamespacestd;classHashTable{private:vector<list<string>>table;inttableSize;inthashFunction(string key){inthashValue =0;for(charc :key){hashValue +=c;}returnhashValue %tableSize;}public:HashTable(intsize):tableSize(size){table.resize(tableSize);}voidinsert(string key){intindex =hashFunction(key);table[index].push_back(key);}boolsearch(string key){intindex =hashFunction(key);for(string item :table[index]){if(item ==key)returntrue;}returnfalse;}voiddisplay(){for(inti =0;i <tableSize;i++){cout <<"Bucket "<<i <<": ";for(string key :table[i]){cout <<key <<" ";}cout <<endl;}}};intmain(){HashTable hashTable(5);hashTable.insert("hello");hashTable.insert("world");hashTable.insert("hash");hashTable.insert("table");hashTable.display();cout <<"Search for 'world': "<<(hashTable.search("world")?"Found":"Not Found")<<endl;cout <<"Search for 'data': "<<(hashTable.search("data")?"Found":"Not Found")<<endl;return0;}
输出:
Bucket 0:
Bucket 1: table
Bucket 2:
Bucket 3: hello world hash
Bucket 4:
Search for ‘world’: Found
Search for ‘data’: Not Found
代码解释:
- 哈希函数:hashFunction 根据字符求和并取模,将键映射到一个固定范围。
改进策略
- 使用动态扩展的哈希表(如 Python 的 dict)。SHA-1 和 SHA-256,这些算法旨在提供高安全性特性,广泛用于密码存储、
- 非加密哈希算法:
如 MurmurHash 和 CityHash,它们不强调安全性,但在性能和冲突率上表现优异,常用于数据库和分布式系统。这种“指纹”唯一性与固定性,使得哈希算法成为计算机科学中不可或缺的工具。文章目录
- 引言:混沌中的秩序之美
- 第一章:哈希的本质——化繁为简的魔法
- 第二章:经典哈希函数——一座算法的博物馆
- 第三章:哈希表的奇迹——从无序到有序的转变
- 3.1 哈希函数的基本实现
- 3.2 基本的哈希表实现
- 3.3 哈希算法的实际应用
- 小结

引言:混沌中的秩序之美
在信息科学的星空下,有一种算法宛如一位洞悉混沌的智者,能够以其独特的规则,在无限的可能性中找到秩序。
然而,哈希表也面临 哈希冲突 的问题,即多个键可能映射到同一索引。- 然后通过取模操作,将累加结果映射到一个固定范围(哈希表的大小)。哈希算法犹如一本密码之书,隐藏了无限的故事,却总能在需要时精准取出。
- 高效性:计算哈希值的过程必须快速且轻量。
解决冲突的常用方法包括:
哈希表的优点:
- 时间复杂度为O(1):无论插入还是查找,平均时间复杂度都极低。
- 尽管简单,但这种方法容易引发哈希冲突,因为不同的输入可能映射到相同的哈希值。