@cloudraker/quickxorhash
v1.1.0
Published
TypeScript implementation of the QuickXorHash algorithm
Readme
@cloudraker/quickxorhash
TypeScript implementation of QuickXorHash, the 160-bit non-cryptographic hash Microsoft uses on OneDrive for Business and SharePoint.
A quick, simple non-cryptographic hash algorithm that works by XORing the bytes in a circular-shifting fashion. — Microsoft OneDrive Dev Center
Install
npm add @cloudraker/quickxorhashRuns anywhere that supports BigUint64Array and TextEncoder (Node ≥ 18,
modern browsers, Bun, Deno). No dependencies.
Usage
One-shot
import { QuickXorHash } from "@cloudraker/quickxorhash";
QuickXorHash.hashBase64("hello world"); // base64 string
QuickXorHash.hashHex("hello world"); // hex string
QuickXorHash.hash(buf); // Uint8Array (20 bytes)
QuickXorHash.hash(buf, "base64"); // base64 string
QuickXorHash.hash(buf, "hex"); // hex stringStreaming / incremental
import { createReadStream } from "node:fs";
import { QuickXorHash } from "@cloudraker/quickxorhash";
const qx = new QuickXorHash();
for await (const chunk of createReadStream("big-file.bin")) {
qx.update(chunk);
}
console.log(qx.digest("base64"));update() accepts Uint8Array, ArrayBuffer (or any ArrayBufferLike), or
string (UTF-8) and returns this for chaining. digest() is idempotent and leaves the internal state
untouched — call reset() to reuse the instance.
QuickXorHash is also available as the default export:
import QuickXorHash from "@cloudraker/quickxorhash";CLI
For convenience, The package ships a quickxorhash script that hashes one or more files and
prints the base64 digest, in the style of shasum:
quickxorhash file.bin
# aZ4QPiBp1z…=
quickxorhash a.bin b.bin
# aZ4QPiBp1z…= a.bin
# 0KQwHs3Bk2…= b.binExits non-zero if any file can't be read.
API
Accepted input types (HashInput): Uint8Array | ArrayBufferLike | string.
| Member | Returns |
| ----------------------------------- | ----------------------- |
| new QuickXorHash() | instance |
| QuickXorHash.hashBase64(data) | string |
| QuickXorHash.hashHex(data) | string |
| QuickXorHash.hash(data) | Uint8Array (20 bytes) |
| QuickXorHash.hash(data, 'base64') | string |
| QuickXorHash.hash(data, 'hex') | string |
| hash.update(chunk) | this |
| hash.digest() | Uint8Array (20 bytes) |
| hash.digest('base64' \| 'hex') | string |
| hash.reset() | this |
Verification
pnpm testSee also
- QuickXorHash algorithm — Microsoft's specification with reference C# code
