Skip to content

CloudRaker/quickxorhash

Repository files navigation

@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/quickxorhash

Runs 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 string

Streaming / 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.bin

Exits 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 test

See also

About

TypeScript implementation of the QuickXorHash algorithm

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors