什么是哈希?

81 阅读2分钟

散列是一种用于将一个密钥转换成另一个值的技术(通常用于加密或数据存储目的)。它的工作原理是运行一个称为密钥的数学函数(称为散列函数)来创建一个新的值--散列(或散列值)。

单向哈希值

加密安全的哈希函数被称为是好的,当它们是单向的(单向哈希值)。这意味着你无法从哈希值中获得原始密钥。

碰撞

如果一个哈希函数对两个或更多的密钥产生了相同的哈希值,那么这时我们就会出现碰撞--这是非理想的。有一些方法来处理这个问题(见这篇文章)。

我们什么时候做散列?

实现哈希表

哈希表是一种数据结构,帮助我们存储键/值数据。它们由两部分组成--一个存储结构(无论是数组、对象等)和一个哈希函数。

散列函数负责将数据装入数据结构中,以便以后可以检索到。

如果存储是有界限的(固定的),比如一个数组,那么哈希函数必须生成一个可以作为索引的键,但要符合数组的大小限制。

例如,计算一个字符串或整数键的索引的一个琐碎的公式是这样的。

index = key % sizeOfTable

这就可以了,但是对于任何固定大小的表,我们最终都可能会遇到碰撞。

请看这里的 "碰撞检测和动态数组大小调整"。

当存储不受限制时--比如使用JavaScript对象时--我们就不必担心碰撞问题。我们只需使用数据的某些独特方面(如电子邮件地址、电话号码或复合键)来创建哈希值,作为索引使用。

然而,如果安全性很重要,我们还是应该使用加密函数来创建哈希值。

这就引出了最后一点。

密码学和数据加密

当涉及到密码学时,哈希是一种非常常见的技术。我们最常见的原因是在将密码存储到数据库之前,将其转换为更安全的东西(比纯文本)。我们这样做有两个原因。

  1. 如果黑客从数据库中窃取了记录,他们不会得到真正的密码--只是散列的密码(因为是单向散列,所以不能被逆转)。
  2. 为了防止员工意外地查看生产数据库中的纯文本密码。

要对密码进行散列,请查看MD5或SHA-2--两种广泛使用的加密散列。