散列
散列的意义:将无限空间的值映射到有限空间。
对于数字,我们能通过取模的方式将实数映射到指定区间。然后快速的通过数组下标查找到对应的数据。而对于其他非数字的值(在计算机实现里,所有值都是数值)转换成数值进行运算。
而一个好的散列函数需要有一下特征:
1. 输入可任意长度,输出是固定长度
2. 不可逆,单向性。给定Hash函数和hash值不能或者很难反算出原始值。
3. 函数性。相同输入得到相同输出。
4. 计算速度要快。如果hash函数计算困难,很难应用到实际问题。
5. 无冲突性。由于输入的区间比输出的区间大,所以hash函数冲突是无法避免的,而当给定Hash函数,一个Hash值和一个与其对应的原始值时,不能或者很难计算出另一些跟其冲突的原始值。
6. 散列要均匀。散列结果尽可能的分布整个区间。
7. 原始值一点变化能引起hash值很大的变化。
算法 | 输出(位) | 描述 |
---|---|---|
MD2 | 128 | (RFC 1319) |
MD4 | MD4(RFC 1320),Message Digest(消息摘要) 的缩写,基于 32位操作数的位操作来实现的。 | |
MD5 | MD5(RFC 1321) | |
SHA-0 | 160 | SHA-0(RFC 6194),安全杂凑标准(Secure Hash Standard) 的缩写 |
SHA-1 | 160 | (RFC 3174) |
SHA-256 | 256 | |
SHA-224 | 224 | |
SHA-512 | 512 | |
SHA-384 | 384 |