`node:crypto` exposes hashing, HMACs, and signing. For large inputs, a `Hash` object can be fed data incrementally via `update()` — pairing naturally with streams so you never need the whole file in memory just to hash it.
js
import { createHash } from "node:crypto";
import { createReadStream } from "node:fs";
function hashFile(path) {
return new Promise((resolve, reject) => {
const hash = createHash("sha256");
const stream = createReadStream(path);
stream.on("data", (chunk) => hash.update(chunk));
stream.on("end", () => resolve(hash.digest("hex")));
stream.on("error", reject);
});
}The same `update`-then-`digest` pattern underlies many blockchain-adjacent tasks: hashing large datasets for a Merkle tree leaf, or verifying a downloaded file's checksum before trusting it.