跳至主要内容

哈希

哈希数据是一种常见的操作,可以通过 Deno 对 Web Crypto API 的支持来实现。此外,Deno 标准库的实现扩展了标准 API,允许更高级的用法。

在 GitHub 上编辑
在我们的第一个示例中,我们将哈希字符串变量的内容。
const message = "The easiest, most secure JavaScript runtime.";
在将我们的消息传递给哈希函数之前,我们需要先将其编码为 uint8 数组。
const messageBuffer = new TextEncoder().encode(message);
在这里,我们使用内置的 crypto.subtle.digest 方法来哈希我们最初的消息。哈希以 ArrayBuffer 的形式返回。为了获得字符串,我们需要做更多工作。
const hashBuffer = await crypto.subtle.digest("SHA-256", messageBuffer);
我们可以使用标准库的 encodeHex 方法将此解码为字符串。
import { encodeHex } from "jsr:@std/encoding/hex";
const hash = encodeHex(hashBuffer);
console.log(hash);
在我们的第二个示例中,我们将哈希文件的内容。哈希文件是一种常见的操作,在不将整个文件加载到内存中的情况下执行此操作是一个典型的要求。
标准库对 Web Crypto API 进行了扩展,这些扩展在执行诸如哈希文件之类的操作时很有用。可以通过 "crypto" 模块访问这些扩展,它可以作为 Web Crypto API 的直接替换,并在可能的情况下委派给本机实现。
import { crypto } from "jsr:@std/crypto";
const file = await Deno.open("example.txt", { read: true });
我们使用 readable 属性获得一个异步可迭代对象。
const readableStream = file.readable;
这次,当我们调用 crypto.subtle.digest 时,我们使用的是导入的版本,它允许我们对异步可迭代对象进行操作。
const fileHashBuffer = await crypto.subtle.digest("SHA-256", readableStream);
最后,我们像之前一样使用 encodeHex 获得十六进制结果。
const fileHash = encodeHex(fileHashBuffer);
console.log(fileHash);

使用 Deno CLI 在本地运行 此示例

deno run --allow-read https://docs.deno.org.cn/examples/hashing.ts