本文已使用 Google Cloud Translation API 自动翻译。
某些文档最好以原文阅读。
哈希函数是一种将值转换为哈希的数学函数,哈希是固定大小的数值。哈希函数用于计算机科学的各个领域,例如数据结构、密码学和信息论。
有许多不同类型的哈希函数,但它们都有一个目标:获取一些输入数据并将其映射到一个小的、固定大小的输出。散列函数的输出通常称为散列值、散列码或简称为散列。
哈希函数是许多计算机科学应用程序的关键部分。例如,哈希表是使用哈希函数存储和检索数据的数据结构。哈希函数还用于数字签名和消息认证代码 (MAC) 的密码学。
要了解哈希函数的工作原理,让我们看一个简单的例子。假设我们有一个学生姓名和身份证号的列表,我们想将这些数据存储在一个哈希表中。我们可以使用哈希函数将每个学生的姓名映射到一个 ID 号。
为此,我们首先需要选择一个哈希函数。有许多不同的散列函数可供选择,但对于本例,我们将使用模散列函数。此函数接受一个输入值并将其除以哈希表的大小。余数是散列值。
例如,假设我们的哈希表的大小为 10。如果我们使用模哈希函数将学生姓名“John Smith”映射到哈希值,我们将得到以下结果:
Hash("John Smith") = ("John Smith" % 10) = 2
这意味着学生姓名“John Smith”将存储在哈希表的槽 2 中。
我们可以使用相同的散列函数将学生姓名“Mary Johnson”映射到散列值:
Hash("Mary Johnson") = ("Mary Johnson" % 10) = 3
这意味着学生姓名“Mary Johnson”将存储在哈希表的槽 3 中。
有许多不同的散列函数可供选择。哈希函数最重要的标准是它应该易于计算。我们在前面的例子中使用的模散列函数是一个简单的散列函数,但它有一些缺点。
首先,模哈希函数只能在哈希表的大小是二的幂时使用。这是因为模运算符仅适用于 2 的幂。
其次,模哈希函数会产生很多冲突。当两个或多个输入值映射到相同的哈希值时,就会发生冲突。例如,如果我们使用取模哈希函数将学生姓名“John Smith”和“Jane Doe”映射到哈希值,我们会得到以下结果:
Hash("John Smith") = ("John Smith" % 10) = 2
Hash("Jane Doe") = ("Jane Doe" % 10) = 2
“John Smith”和“Jane Doe”都映射到散列值 2,因此我们发生了冲突。
有很多方法可以避免冲突,但最常见的方法是使用更大的哈希表。更大的哈希表意味着输入值要映射到的槽更多,因此发生冲突的可能性会降低。
哈希函数也用于密码学。例如,数字签名是根据某些输入数据(例如文档)计算得出的哈希值。然后使用发件人的私钥对签名进行加密。
当接收方得到签名后,他们可以使用发送方的公钥对其进行解密。然后他们可以计算输入数据的哈希值并将其与解密的签名进行比较。如果两个值匹配,则数据未被篡改,可以安全使用。
哈希函数也用于消息验证代码 (MAC)。 MAC 是根据某些输入数据(例如消息和密钥)计算得出的哈希值。然后 MAC 随消息一起发送。
当接收方收到消息时,他们可以根据消息和密钥计算 MAC。然后他们可以将计算出的 MAC 与随消息一起发送的 MAC 进行比较。如果两个 MAC 匹配,则消息未被篡改,可以安全使用。
哈希函数是将输入值映射到哈希值的数学函数。哈希函数用于计算机科学的各个领域,例如数据结构、密码学和信息论。
有许多不同类型的哈希函数,但它们都有一个目标:获取一些输入数据并将其映射到一个小的、固定大小的输出。散列函数的输出通常称为散列值、散列码或简称为散列。
哈希函数是许多计算机科学应用程序的关键部分。例如,哈希表是使用哈希函数存储和检索数据的数据结构。哈希函数还用于数字签名和消息认证代码 (MAC) 的密码学。