1. 什么是哈希(Hash)
哈希是一种映射关系,把任意长度的输入(字符串、文件、对象等)映射为一个固定长度的输出(哈希值)。
-
哈希函数:
h(x) -> y
-
输出 y 就叫 哈希值 ,也常叫 摘要。
2. 哈希算法的特点
一个好的哈希算法,通常要满足:
-
确定性:同样的输入,哈希结果永远相同。
-
高效性:计算速度要快。
-
均匀性:输出要尽量分布均匀,避免冲突集中。
-
不可逆性(安全哈希):从哈希值不能反推原文。
-
抗碰撞性:不同输入得到相同哈希值的概率要极低。
3. 分类
哈希算法大体有两类:
(1)一般哈希(用于数据结构)
-
应用在 HashMap、HashSet、数据库索引等场景。
-
比如 Java 的
String.hashCode()
,就是一种简单哈希算法。public int hashCode() { int h = 0; for (char c : value) { h = 31 * h + c; } return h; }
-
目的:让数据分布均匀,查找插入删除更快。
(2)加密/安全哈希(用于安全领域)
-
强调不可逆 和抗碰撞。
-
常见算法:
-
MD5(128 位,已不安全,常用于校验完整性)
-
SHA-1(160 位,已被攻破)
-
SHA-2(SHA-256/512 等,现广泛使用)
-
SHA-3(新标准,基于 Keccak 算法)
-
-
这些算法广泛应用于:
-
密码存储(加盐哈希)
-
数字签名
-
文件完整性校验(下载包校验)
-
4. 哈希冲突
因为输出空间有限,不同输入可能得到相同哈希值,这就叫 冲突。
常见解决办法:
-
开放定址法:发生冲突时,继续探测下一个位置。
-
链地址法:每个槽用链表/红黑树存储冲突元素(Java HashMap 1.8 就是这样)。
-
再哈希:用多个哈希函数重新计算。
5. 应用场景
-
数据结构:HashMap、HashSet、布隆过滤器。
-
数据库:哈希索引。
-
安全领域:密码保护(MD5+盐、SHA-256)。
-
完整性校验:下载文件时对比 MD5/SHA 值。
-
负载均衡:一致性哈希,用于分布式缓存、分库分表。
6. 面试加分点
-
哈希算法不是加密算法 :
加密可以解密,哈希通常不可逆。
-
安全哈希存密码要加盐 :
直接存 MD5/sha1 容易被彩虹表攻击,加盐能增强安全性。
-
一致性哈希的优势 :
在分布式系统里,节点变化时只需少量数据迁移,而不是全部重算。
✅ 面试总结版(30 秒能答完):
哈希算法就是把任意长度的数据映射成固定长度的哈希值。它有确定性、效率高、分布均匀的特点。常见的分为一般哈希(用于 HashMap 等数据结构)和安全哈希(如 MD5、SHA 系列,用于校验和密码存储)。哈希冲突不可避免,通常通过链表法或开放定址法解决。它的应用场景非常广,从数据存储、分布式系统,到安全加密、完整性校验都有。