散列是一种用于将一个密钥转换成另一个值的技术(通常用于加密或数据存储目的)。它的工作原理是运行一个称为密钥的数学函数(称为散列函数)来创建一个新的值--散列(或散列值)。
单向哈希值
加密安全的哈希函数被称为是好的,当它们是单向的(单向哈希值)。这意味着你无法从哈希值中获得原始密钥。
碰撞
如果一个哈希函数对两个或更多的密钥产生了相同的哈希值,那么这时我们就会出现碰撞--这是非理想的。有一些方法来处理这个问题(见这篇文章)。
我们什么时候做散列?
实现哈希表
哈希表是一种数据结构,帮助我们存储键/值数据。它们由两部分组成--一个存储结构(无论是数组、对象等)和一个哈希函数。
散列函数负责将数据装入数据结构中,以便以后可以检索到。
如果存储是有界限的(固定的),比如一个数组,那么哈希函数必须生成一个可以作为索引的键,但要符合数组的大小限制。
例如,计算一个字符串或整数键的索引的一个琐碎的公式是这样的。
index = key % sizeOfTable
这就可以了,但是对于任何固定大小的表,我们最终都可能会遇到碰撞。
请看这里的 "碰撞检测和动态数组大小调整"。
当存储不受限制时--比如使用JavaScript对象时--我们就不必担心碰撞问题。我们只需使用数据的某些独特方面(如电子邮件地址、电话号码或复合键)来创建哈希值,作为索引使用。
然而,如果安全性很重要,我们还是应该使用加密函数来创建哈希值。
这就引出了最后一点。
密码学和数据加密
当涉及到密码学时,哈希是一种非常常见的技术。我们最常见的原因是在将密码存储到数据库之前,将其转换为更安全的东西(比纯文本)。我们这样做有两个原因。
- 如果黑客从数据库中窃取了记录,他们不会得到真正的密码--只是散列的密码(因为是单向散列,所以不能被逆转)。
- 为了防止员工意外地查看生产数据库中的纯文本密码。
要对密码进行散列,请查看MD5或SHA-2--两种广泛使用的加密散列。