From 13c5b0d9cb5e43efc4b6d4f30d4cb583270ac604 Mon Sep 17 00:00:00 2001 From: Joel Shepherd Date: Tue, 3 Jun 2025 20:34:35 +1000 Subject: [PATCH] Added rapidhash algorithm (#20163) --- bench/snippets/hash.mjs | 8 ++++++++ docs/api/hashing.md | 1 + examples/hashing.js | 1 + packages/bun-types/bun.d.ts | 1 + src/bun.js/api/HashObject.zig | 2 ++ test/js/bun/util/hash.test.js | 5 +++++ 6 files changed, 18 insertions(+) diff --git a/bench/snippets/hash.mjs b/bench/snippets/hash.mjs index bcc619ff30..6419b59fb5 100644 --- a/bench/snippets/hash.mjs +++ b/bench/snippets/hash.mjs @@ -50,6 +50,10 @@ bench("murmur64v2 (short)", () => { Bun.hash.murmur64v2(shortStr); }); +bench("rapidhash (short)", () => { + Bun.hash.rapidhash(shortStr); +}); + bench("wyhash (128 KB)", () => { Bun.hash.wyhash(longStr); }); @@ -94,4 +98,8 @@ bench("murmur64v2 (128 KB)", () => { Bun.hash.murmur64v2(longStr); }); +bench("rapidhash (128 KB)", () => { + Bun.hash.rapidhash(longStr); +}); + run(); diff --git a/docs/api/hashing.md b/docs/api/hashing.md index 1b1b754a75..79d3c54e86 100644 --- a/docs/api/hashing.md +++ b/docs/api/hashing.md @@ -175,6 +175,7 @@ Bun.hash.xxHash3("data", 1234); Bun.hash.murmur32v3("data", 1234); Bun.hash.murmur32v2("data", 1234); Bun.hash.murmur64v2("data", 1234); +Bun.hash.rapidhash("data", 1234); ``` ## `Bun.CryptoHasher` diff --git a/examples/hashing.js b/examples/hashing.js index b4a27c8bdd..7a66b9fefe 100644 --- a/examples/hashing.js +++ b/examples/hashing.js @@ -17,6 +17,7 @@ console.log(Bun.hash.xxHash3(input)); // bigint console.log(Bun.hash.murmur32v3(input)); // number console.log(Bun.hash.murmur32v2(input)); // number console.log(Bun.hash.murmur64v2(input)); // bigint +console.log(Bun.hash.rapidhash(input)); // bigint // Second argument accepts a seed where relevant console.log(Bun.hash(input, 12345)); diff --git a/packages/bun-types/bun.d.ts b/packages/bun-types/bun.d.ts index 7f9cb51183..674f868407 100644 --- a/packages/bun-types/bun.d.ts +++ b/packages/bun-types/bun.d.ts @@ -1865,6 +1865,7 @@ declare module "bun" { murmur32v3: (data: string | ArrayBufferView | ArrayBuffer | SharedArrayBuffer, seed?: number) => number; murmur32v2: (data: string | ArrayBufferView | ArrayBuffer | SharedArrayBuffer, seed?: number) => number; murmur64v2: (data: string | ArrayBufferView | ArrayBuffer | SharedArrayBuffer, seed?: bigint) => bigint; + rapidhash: (data: string | ArrayBufferView | ArrayBuffer | SharedArrayBuffer, seed?: bigint) => bigint; } type JavaScriptLoader = "jsx" | "js" | "ts" | "tsx"; diff --git a/src/bun.js/api/HashObject.zig b/src/bun.js/api/HashObject.zig index ee8cb25d01..f06b1ee9f0 100644 --- a/src/bun.js/api/HashObject.zig +++ b/src/bun.js/api/HashObject.zig @@ -27,6 +27,7 @@ pub const xxHash3 = hashWrap(struct { pub const murmur32v2 = hashWrap(std.hash.murmur.Murmur2_32); pub const murmur32v3 = hashWrap(std.hash.murmur.Murmur3_32); pub const murmur64v2 = hashWrap(std.hash.murmur.Murmur2_64); +pub const rapidhash = hashWrap(std.hash.RapidHash); pub fn create(globalThis: *JSC.JSGlobalObject) JSC.JSValue { const function = JSC.createCallback(globalThis, ZigString.static("hash"), 1, wyhash); @@ -42,6 +43,7 @@ pub fn create(globalThis: *JSC.JSGlobalObject) JSC.JSValue { "murmur32v2", "murmur32v3", "murmur64v2", + "rapidhash", }; inline for (fns) |name| { const value = JSC.createCallback( diff --git a/test/js/bun/util/hash.test.js b/test/js/bun/util/hash.test.js index e0a2f7eaca..6dff264cef 100644 --- a/test/js/bun/util/hash.test.js +++ b/test/js/bun/util/hash.test.js @@ -66,3 +66,8 @@ it(`Bun.hash.murmur64v2()`, () => { gcTick(); expect(Bun.hash.murmur64v2(new TextEncoder().encode("hello world"))).toBe(0xd3ba2368a832afcen); }); +it(`Bun.hash.rapidhash()`, () => { + expect(Bun.hash.rapidhash("hello world")).toBe(0x58a89bdcee89c08cn); + gcTick(); + expect(Bun.hash.rapidhash(new TextEncoder().encode("hello world"))).toBe(0x58a89bdcee89c08cn); +});