哈希
数据哈希是一个常见操作,通过 Deno 对 Web Crypto API 的支持得以实现。此外,Deno 标准库的实现扩展了标准 API,支持更高级的用法。
在我们的第一个示例中,我们将对字符串变量的内容进行哈希。
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 -R https://docs.deno.org.cn/examples/scripts/hashing.ts