哈希算法索引
哈希函数(Hash Function)是一种将任意长度的数据映射为固定长度摘要值的函数。 哈希算法广泛应用于数据完整性校验、数字签名、密码存储、数据索引、分布式系统等领域。 本页是基础哈希算法的系统索引,涵盖校验和算法、密码学哈希、快速非加密哈希等主要类别。
哈希函数根据其设计目标和安全属性,可分为密码学哈希函数和非加密哈希函数两大类。 密码学哈希函数要求具备抗原像攻击(Preimage Resistance)、抗第二原像攻击(Second Preimage Resistance)和抗碰撞攻击(Collision Resistance)等安全属性, 而非加密哈希函数则主要追求计算速度和良好的分布性。
评价哈希算法的主要指标包括:输出长度(决定了理论安全上限)、计算速度、 安全性(是否已发现碰撞攻击)、雪崩效应(输入微小变化导致输出大幅变化的程度)以及 硬件友好性(是否适合硬件加速实现)。
哈希算法按用途可分为以下几个主要类别:
| 类别 | 典型算法 | 主要用途 |
|---|---|---|
| 校验和算法 | CRC, Adler-32, Fletcher | 数据传输错误检测 |
| 密码学哈希 | SHA-256, SHA-3, BLAKE3, MD5(已弃用) | 数字签名、完整性验证 |
| 快速哈希 | xxHash, MurmurHash, CityHash, FarmHash | 哈希表、数据分片、校验 |
| 国密算法 | SM3 | 中国国家标准密码学应用 |
| 密码哈希 | bcrypt, scrypt, Argon2, PBKDF2 | 密码安全存储 |
| 消息认证 | SipHash, HMAC | 消息认证码、防哈希洪水攻击 |
密码哈希函数(Password Hashing Function)通过增加计算成本(CPU、内存)来减缓暴力破解速度,专门用于安全存储用户密码。
| 算法 | 全称 | 输出 | 年份 | 备注 |
|---|---|---|---|---|
| MD2 | Message-Digest Algorithm 2 | 128 bit | 1989 | Rivest 设计,已弃用 |
| MD4 | Message-Digest Algorithm 4 | 128 bit | 1990 | Rivest 设计,已严重破解 |
| HAVAL | HAVAL Hash | 128~256 bit | 1992 | 可变轮数,已发现碰撞 |
| Tiger | Tiger Hash Function | 192 bit | 1995 | Anderson/Biham 设计,针对64位优化 |
| GOST | GOST R 34.11-94 / -2012 | 256/512 bit | 1994 | 俄罗斯国家标准 |
| FNV | Fowler-Noll-Vo | 32~1024 bit | 1991 | 简单快速的非加密哈希 |
| DJB2 | Daniel J. Bernstein Hash | 32 bit | 1991 | 经典字符串哈希 |
| Jenkins | Jenkins hash (one-at-a-time) | 32 bit | 1997 | Bob Jenkins 设计的简单哈希 |
| SpookyHash | SpookyHash | 64/128 bit | 2011 | Bob Jenkins 设计的高速哈希 |
| MetroHash | MetroHash | 64/128 bit | 2015 | 针对现代CPU优化 |
| HighwayHash | HighwayHash | 64/256 bit | 2017 | Google 设计,利用 SIMD 指令 |
以下是常见哈希算法在现代 x86-64 平台上的大致性能参考(单线程,大输入):
| 算法 | 输出长度 | 类型 | 速度 (GB/s) | 安全性 |
|---|---|---|---|---|
| BLAKE3 | 256 bit | 密码学 | ~7.0 | 安全 |
| XXH3 | 64/128 bit | 非加密 | ~11.0 | 不适用 |
| xxHash64 | 64 bit | 非加密 | ~9.5 | 不适用 |
| MurmurHash3 | 32/128 bit | 非加密 | ~5.5 | 不适用 |
| BLAKE2b | 512 bit | 密码学 | ~3.5 | 安全 |
| BLAKE2s | 256 bit | 密码学 | ~3.0 | 安全 |
| SHA-256 | 256 bit | 密码学 | ~1.8 | 安全 |
| SM3 | 256 bit | 密码学 | ~1.5 | 安全 |
| SHA-512 | 512 bit | 密码学 | ~2.5 | 安全 |
| SHA-3-256 | 256 bit | 密码学 | ~1.2 | 安全 |
| MD5 | 128 bit | 密码学 | ~3.5 | 已破解 |
| CRC-32 | 32 bit | 校验和 | ~15.0 | 不适用 |
| SHA-1 | 160 bit | 密码学 | ~2.5 | 已破解 |
| RIPEMD-160 | 160 bit | 密码学 | ~1.5 | 安全 |
| Whirlpool | 512 bit | 密码学 | ~1.0 | 安全 |
注:速度数据为近似参考值,实际性能因平台、实现和输入大小而异。BLAKE3 支持多线程并行加速。
| 年份 | 事件 |
|---|---|
| 1961 | CRC 概念由 W. Wesley Peterson 提出 |
| 1989 | MD2 发布(Rivest) |
| 1990 | MD4 发布(Rivest) |
| 1991 | FNV 哈希设计;DJB2 发布 |
| 1992 | MD5 发布(Rivest);RIPEMD 开发 |
| 1993 | SHA-0 发布(NIST) |
| 1995 | SHA-1 发布;Tiger 发布;Adler-32 随 zlib 发布 |
| 1996 | RIPEMD-160 发布 |
| 1999 | bcrypt 发布 |
| 2000 | PBKDF2 标准化(RFC 2898);Whirlpool 发布 |
| 2001 | SHA-2 系列(SHA-256 等)发布 |
| 2004 | 王小云团队发布 MD5 碰撞攻击 |
| 2008 | MurmurHash 发布;BLAKE 参与 SHA-3 竞赛 |
| 2009 | scrypt 发布;Bitcoin(使用 SHA-256)上线 |
| 2011 | SHA-3 竞赛决出 Keccak 为获胜者;CityHash 发布 |
| 2012 | SHA-3 标准化;BLAKE2 发布;SipHash 发布;xxHash 发布;SM3 成为国家标准 |
| 2015 | Argon2 赢得密码哈希竞赛;FarmHash 发布 |
| 2017 | SHA-1 首次实际碰撞攻击(SHAttered);HighwayHash 发布 |
| 2019 | XXH3 发布 |
| 2020 | BLAKE3 正式发布 |
- Peterson, W.W. and Brown, D.T. (1961). "Cyclic Codes for Error Detection". Proceedings of the IRE. 49 (1): 228–235.
- Rivest, R. (1992). "The MD5 Message-Digest Algorithm". RFC 1321.
- NIST (2001). "Secure Hash Standard (SHS)". FIPS PUB 180-2.
- NIST (2015). "SHA-3 Standard: Permutation-Based Hash and Extendable-Output Functions". FIPS PUB 202.
- Aumasson, J.-P., Neves, S., Wilcox-O'Hearn, Z., Winnerlein, C. (2013). "BLAKE2: simpler, smaller, fast as MD5".
- O'Connor, J., Aumasson, J.-P. (2020). "BLAKE3: one function, fast everywhere".
- Collet, Y. (2019). "xxHash - Extremely Fast Hash Algorithm". GitHub Repository.
- Appleby, A. (2008). "MurmurHash3". Retrieved from github.com/aappleby.
- 国家密码管理局 (2010). "SM3 密码杂凑算法". GM/T 0004-2012.
- Aumasson, J.-P. and Bernstein, D.J. (2012). "SipHash: a fast short-input PRF".
- Biryukov, A., Dinu, D., Khovratovich, D. (2016). "Argon2: the memory-hard function for password hashing and other applications".
- Wang, X., Yu, H. (2005). "How to Break MD5 and Other Hash Functions". EUROCRYPT 2005.
- Stevens, M., Bursztein, E., Karpman, P., Albertini, A., Markov, Y. (2017). "The first collision for full SHA-1". CRYPTO 2017.