哈希函数

在计算机编程中,哈希函数会将文本(或其他数据)映射为整数。通常,不同的输入会映射到不同的输出,但有时也可能发生碰撞,即不同输入得到相同输出。

密码学哈希函数将文本或二进制数据转换为固定长度的哈希值,并具有抗碰撞不可逆的特性。SHA3-256 就是一个密码学哈希函数示例:

SHA3-256("hello") = "3338be694f50c5f338814986cdf0686453a888b84f424d792af4b9202398f392"

上述 SHA3-256 哈希计算可以用 Python 编写如下:

import hashlib, binascii
sha3_256hash = hashlib.sha3_256(b'hello').digest()
print("SHA3-256('hello') =", binascii.hexlify(sha3_256hash))

运行上述代码示例:https://repl.it/@nakov/SHA3-256-hello-in-Python

同一个 SHA3-256 哈希计算也可以用 JavaScript 编写如下(先执行 npm install js-sha3):

sha3 = require('js-sha3');
let sha3_256hash = sha3.sha3_256('hello').toString();
console.log("SHA3-256('hello') =", sha3_256hash);

运行上述代码示例:https://repl.it/@nakov/SHA3-256-hello-in-JS

哈希计算(软件工程中的概念)

计算某个哈希函数值的过程称为“哈希计算”。

在上面的示例中,文本 John Smith 的哈希值为 02Lisa Smith 的哈希值为 01。输入文本 John SmithSandra Dee 的哈希值都是 02,这种现象称为“碰撞”。

哈希函数在设计上具有不可逆性,也就是说,不存在能够从哈希值快速恢复输入消息的算法。

在编程中,哈希函数用于实现“哈希表”(关联数组)这种数据结构;哈希表将某种输入类型的值映射到另一种类型的值,例如将产品名称(文本)映射到产品价格(小数)。

一种朴素的哈希函数只是将输入数据或文本的各个字节相加,这会造成大量碰撞。例如,helloehllo 会得到相同的哈希码。更好的哈希函数可以使用 Merkle–Damgård 构造:先将第一个字节作为状态,再转换该状态(例如乘以 31 这样的质数),随后将下一个字节加入状态,然后再次转换状态并加入下一个字节,以此类推。这种方式可以显著降低碰撞率,并产生更均匀的分布。

密码学哈希函数

在密码学中,哈希函数将任意大小的输入数据(如文本消息)转换为固定大小的结果(如 256 位),该结果称为哈希值,也称哈希码、消息摘要,或简称哈希。计算机密码学中使用的哈希函数称为“密码学哈希函数”。SHA-256SHA3-256 就是这类函数的示例,它们会将任意输入转换为 256 位输出。

密码学哈希函数示例

以密码学哈希函数 SHA-256 为例,计算文本消息 hello 的哈希值:

SHA-256("hello") = "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824"

上述 SHA-256 计算可以用 Python 编写如下:

import hashlib, binascii

sha256hash = hashlib.sha256(b'hello').digest()
print("SHA-256('hello') = ", binascii.hexlify(sha256hash))

运行上述代码示例:https://repl.it/@nakov/SHA-256-hello-in-Python

不存在能够从哈希值(上例中的 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824)高效找出输入消息(上例中的 hello)的算法。众所周知,密码学哈希函数无法反向还原,因此常用于在不泄露输入的情况下对其进行编码,例如在不泄露私钥的情况下,将私钥编码为区块链地址。

再以密码学哈希函数 SHA3-512 为例,计算同一个文本消息 hello 的哈希值:

SHA3-512("hello") = "75d527c368f2efe848ecf6b073a36767800805e9eef2b1857d5f984f036eb6df891d75f72d9b154518c1cd58835286d1da9a38deba3de98b5a53e5ed78a84976"

密码学哈希函数在线演示

可以通过这个在线工具试用常见的密码学哈希函数:https://www.fileformat.info/tool/hash.htm

密码学哈希函数广泛用于密码学、计算机编程和区块链系统。

results matching ""

    No results matching ""