import { assert } from 'chai'; import { hashInt32, hashUint32, hashBoolean, hashString, hashAsciiString, hashUint8Array, hashUint32Array, hashUint32Pair, hashFloat64, fuzzyHashFloat64, hashNumber, fuzzyHashNumber } from '../../../lib/functional/hash/murmurhash'; describe('functional.hash.murmurhash', () => { describe('hashInt32', () => { test.each([ [0, 593689054, undefined], [1, 4226891818, undefined], [-1, 1982413648, undefined], [2, 1085422463, undefined], [-2, 1087594050, undefined], [9999999, 3800927862, undefined], [-9999999, 1029969130, undefined], [2147483647, 2641277762, undefined], [-2147483648, 2576668564, undefined], [0, 2946814719, 31], [1, 29110604, 31], [-1, 631368685, 31], [2, 277044254, 31], [-2, 1788940192, 31], [9999999, 3475291916, 31], [-9999999, 3940014918, 31], [2147483647, 2000002140, 31], [-2147483648, 2571171902, 31], ])('hashInt32#%#', (key: number, result: number, seed: number | undefined) => { assert.strictEqual(hashInt32(key, seed), result); }); }); describe('hashUint32', () => { test.each([ [0, 593689054, undefined], [1, 4226891818, undefined], [2, 1085422463, undefined], [9999999, 3800927862, undefined], [2147483648, 2576668564, undefined], [4294967295, 1982413648, undefined], [0, 2946814719, 31], [1, 29110604, 31], [2, 277044254, 31], [9999999, 3475291916, 31], [2147483648, 2571171902, 31], [4294967295, 631368685, 31], ])('hashUint32#%#', (key: number, result: number, seed: number | undefined) => { assert.strictEqual(hashUint32(key, seed), result); }); }); describe('hashBoolean', () => { test.each([ [false, 593689054, undefined], [true, 4226891818, undefined], [false, 2946814719, 31], [true, 29110604, 31], ])('hashBoolean#%#', (key: boolean, result: number, seed: number | undefined) => { assert.strictEqual(hashBoolean(key, seed), result); }); }); describe('hashString', () => { test.each([ ['', 0, undefined], ['test', 1351191292, undefined], ['hello', 3619887497, undefined], ['Hello, World!', 1777475617, undefined], ['привет', 3528813053, undefined], ['', 1257683291, 31], ['test', 2890817494, 31], ['hello', 3649293279, 31], ['Hello, World!', 3619720628, 31], ['привет', 2813322197, 31], ])('hashString#%#', (key: string, result: number, seed: number | undefined) => { assert.strictEqual(hashString(key, seed), result); }); }); describe('hashAsciiString', () => { test.each([ ['', 0, undefined], ['a', 1009084850, undefined], ['ab', 2613040991, undefined], ['abc', 3017643002, undefined], ['abcd', 1139631978, undefined], ['abcde', 3902511862, undefined], ['abcdef', 1635893381, undefined], ['abcdefg', 2285673222, undefined], ['abcdefgh', 1239272644, undefined], ['Hello, world!', 3224780355, undefined], ['', 1257683291, 31], ['a', 3387765255, 31], ['ab', 1334718146, 31], ['abc', 339830091, 31], ['abcd', 1404501894, 31], ['abcde', 448839291, 31], ['abcdef', 3202968729, 31], ['abcdefg', 1693175664, 31], ['abcdefgh', 3031201380, 31], ['Hello, world!', 3532224199, 31], ])('hashAsciiString#%#', (key: string, result: number, seed: number | undefined) => { assert.strictEqual(hashAsciiString(key, seed), result); }); }); describe('hashUint8Array', () => { const bytes = [0xcc, 0x6a, 0x2c, 0x81, 0x0e, 0xeb, 0x89, 0x52]; test.each([ [new Uint8Array(0), 0, undefined], [Uint8Array.from(bytes.slice(0, 1)), 3494976349, undefined], [Uint8Array.from(bytes.slice(0, 2)), 1247219304, undefined], [Uint8Array.from(bytes.slice(0, 3)), 1402358452, undefined], [Uint8Array.from(bytes.slice(0, 4)), 3921640488, undefined], [Uint8Array.from(bytes.slice(0, 5)), 2106346788, undefined], [Uint8Array.from(bytes.slice(0, 6)), 2854419740, undefined], [Uint8Array.from(bytes.slice(0, 7)), 1340583150, undefined], [Uint8Array.from(bytes.slice(0, 8)), 2452805034, undefined], [Uint8Array.from([104, 101, 108, 108, 111]), 613153351, undefined], [new Uint8Array(0), 1257683291, 31], [Uint8Array.from(bytes.slice(0, 1)), 78690833, 31], [Uint8Array.from(bytes.slice(0, 2)), 3204522875, 31], [Uint8Array.from(bytes.slice(0, 3)), 390869904, 31], [Uint8Array.from(bytes.slice(0, 4)), 2986193910, 31], [Uint8Array.from(bytes.slice(0, 5)), 4085820395, 31], [Uint8Array.from(bytes.slice(0, 6)), 320568758, 31], [Uint8Array.from(bytes.slice(0, 7)), 3959234323, 31], [Uint8Array.from(bytes.slice(0, 8)), 1202865762, 31], [Uint8Array.from([104, 101, 108, 108, 111]), 168865661, 31], ])('hashUint8Array#%#', (key: Uint8Array, result: number, seed: number | undefined) => { assert.strictEqual(hashUint8Array(key, seed), result); }); }); describe('hashUint32Array', () => { test.each([ [[], 0, undefined], [[1], 4226891818, undefined], [[1, 2], 3278122630, undefined], [[1, 2, 3], 3923217110, undefined], [[1, 2, 3, 4], 1145416960, undefined], [[1, 2, 3, 4, 5], 3290217066, undefined], [[1, 2, 3, 4, 5, 6], 3307097393, undefined], [[1, 2, 3, 4, 5, 6, 7], 1329238313, undefined], [[1, 2, 3, 4, 5, 6, 7, 8], 183507092, undefined], [[12345, 23456, 34567, 45678, 56789], 1893757520, undefined], [[], 1257683291, 31], [[1], 29110604, 31], [[1, 2], 1123168570, 31], [[1, 2, 3], 2228489531, 31], [[1, 2, 3, 4], 3387887132, 31], [[1, 2, 3, 4, 5], 364016591, 31], [[1, 2, 3, 4, 5, 6], 1319349018, 31], [[1, 2, 3, 4, 5, 6, 7], 215267531, 31], [[1, 2, 3, 4, 5, 6, 7, 8], 1138455859, 31], [[12345, 23456, 34567, 45678, 56789], 502193026, 31], ])('hashUint32Array#%#', (key: number[], result: number, seed: number | undefined) => { assert.strictEqual(hashUint32Array(key, seed), result); }); }); describe('hashUint32Pair', () => { test.each([ [[0, 0], 1669671676, undefined], [[1, 2], 3278122630, undefined], [[12345, 23456], 680666192, undefined], [[0, 0], 3059498039, 31], [[1, 2], 1123168570, 31], [[12345, 23456], 3709191691, 31], ])('hashUint32Pair#%#', (key: [number, number], result: number, seed: number | undefined) => { assert.strictEqual(hashUint32Pair(key, seed), result); }); }); describe('hashFloat64', () => { test.each([ [0, 1669671676, undefined], [-0, 1366273829, undefined], [NaN, 1428788237, undefined], [Infinity, 420913893, undefined], [-Infinity, 1915664072, undefined], [100, 3750064106, undefined], [-100, 2463292615, undefined], [1, 4152582287, undefined], [-1, 3800686449, undefined], [0.5, 2677528480, undefined], [-0.5, 425809119, undefined], [1.005, 839092187, undefined], [-1.005, 225499019, undefined], [3.14159265358979323846, 2303256014, undefined], [-3.14159265358979323846, 2231227058, undefined], [Number.MAX_SAFE_INTEGER, 3279583865, undefined], [Number.MIN_SAFE_INTEGER, 2746207972, undefined], [Number.EPSILON, 125283782, undefined], [Number.MAX_VALUE, 474144502, undefined], [Number.MIN_VALUE, 1392991556, undefined], [0, 3059498039, 31], [-0, 2781181509, 31], [NaN, 1625948381, 31], [Infinity, 1571403501, 31], [-Infinity, 4227135485, 31], [100, 3606535095, 31], [-100, 966609301, 31], [1, 2003395221, 31], [-1, 3523196978, 31], [0.5, 3826928677, 31], [-0.5, 3280821856, 31], [1.005, 3766156859, 31], [-1.005, 253650725, 31], [3.14159265358979323846, 2422986656, 31], [-3.14159265358979323846, 2341852704, 31], [Number.MAX_SAFE_INTEGER, 2385652387, 31], [Number.MIN_SAFE_INTEGER, 2378236565, 31], [Number.EPSILON, 2679165630, 31], [Number.MAX_VALUE, 3965828556, 31], [Number.MIN_VALUE, 315204188, 31], ])('hashFloat64#%#', (key: number, result: number, seed: number | undefined) => { assert.strictEqual(hashFloat64(key, seed), result); }); }); describe('fuzzyHashFloat64', () => { test.each([ [0, 1669671676, undefined], [-0, 1366273829, undefined], [NaN, 1428788237, undefined], [Infinity, 420913893, undefined], [-Infinity, 1915664072, undefined], [100, 3750064106, undefined], [-100, 2463292615, undefined], [1, 4152582287, undefined], [-1, 3800686449, undefined], [0.5, 2677528480, undefined], [-0.5, 425809119, undefined], [1.005, 839092187, undefined], [-1.005, 225499019, undefined], [3.14159265358979323846, 2303256014, undefined], [-3.14159265358979323846, 2231227058, undefined], // [Number.MAX_SAFE_INTEGER, 3279583865, undefined], // [Number.MIN_SAFE_INTEGER, 2746207972, undefined], [Number.EPSILON, 125283782, undefined], // [Number.MAX_VALUE, 474144502, undefined], // [Number.MIN_VALUE, 1392991556, undefined], [0, 3059498039, 31], [-0, 2781181509, 31], [NaN, 1625948381, 31], [Infinity, 1571403501, 31], [-Infinity, 4227135485, 31], [100, 3606535095, 31], [-100, 966609301, 31], [1, 2003395221, 31], [-1, 3523196978, 31], [0.5, 3826928677, 31], [-0.5, 3280821856, 31], [1.005, 3766156859, 31], [-1.005, 253650725, 31], [3.14159265358979323846, 2422986656, 31], [-3.14159265358979323846, 2341852704, 31], // [Number.MAX_SAFE_INTEGER, 2385652387, 31], // [Number.MIN_SAFE_INTEGER, 2378236565, 31], [Number.EPSILON, 2679165630, 31], // [Number.MAX_VALUE, 3965828556, 31], // [Number.MIN_VALUE, 315204188, 31], ])('fuzzyHashFloat64#%#', (key: number, result: number, seed: number | undefined) => { assert.strictEqual(fuzzyHashFloat64(key, seed), result); }); }); describe('hashNumber', () => { test.each([ // ints [0, 593689054, undefined], [1, 4226891818, undefined], [-1, 1982413648, undefined], [2, 1085422463, undefined], [-2, 1087594050, undefined], [9999999, 3800927862, undefined], [-9999999, 1029969130, undefined], [2147483647, 2641277762, undefined], [-2147483648, 2576668564, undefined], // uints [2147483648, 2576668564, undefined], [4294967295, 1982413648, undefined], // floats // [0, 1669671676, undefined], [-0, 1366273829, undefined], [NaN, 1428788237, undefined], [Infinity, 420913893, undefined], [-Infinity, 1915664072, undefined], // [100, 3750064106, undefined], // [-100, 2463292615, undefined], // [1, 4152582287, undefined], // [-1, 3800686449, undefined], [0.5, 2677528480, undefined], [-0.5, 425809119, undefined], [1.005, 839092187, undefined], [-1.005, 225499019, undefined], [3.14159265358979323846, 2303256014, undefined], [-3.14159265358979323846, 2231227058, undefined], [Number.MAX_SAFE_INTEGER, 3279583865, undefined], [Number.MIN_SAFE_INTEGER, 2746207972, undefined], [Number.EPSILON, 125283782, undefined], [Number.MAX_VALUE, 474144502, undefined], [Number.MIN_VALUE, 1392991556, undefined], // ints [0, 2946814719, 31], [1, 29110604, 31], [-1, 631368685, 31], [2, 277044254, 31], [-2, 1788940192, 31], [9999999, 3475291916, 31], [-9999999, 3940014918, 31], [2147483647, 2000002140, 31], [-2147483648, 2571171902, 31], // uints [2147483648, 2571171902, 31], [4294967295, 631368685, 31], // floats // [0, 3059498039, 31], [-0, 2781181509, 31], [NaN, 1625948381, 31], [Infinity, 1571403501, 31], [-Infinity, 4227135485, 31], // [100, 3606535095, 31], // [-100, 966609301, 31], // [1, 2003395221, 31], // [-1, 3523196978, 31], [0.5, 3826928677, 31], [-0.5, 3280821856, 31], [1.005, 3766156859, 31], [-1.005, 253650725, 31], [3.14159265358979323846, 2422986656, 31], [-3.14159265358979323846, 2341852704, 31], [Number.MAX_SAFE_INTEGER, 2385652387, 31], [Number.MIN_SAFE_INTEGER, 2378236565, 31], [Number.EPSILON, 2679165630, 31], [Number.MAX_VALUE, 3965828556, 31], [Number.MIN_VALUE, 315204188, 31], ])('hashNumber#%#', (key: number, result: number, seed: number | undefined) => { assert.strictEqual(hashNumber(key, seed), result); }); }); describe('fuzzyHashNumber', () => { test.each([ // ints [0, 593689054, undefined], [1, 4226891818, undefined], [-1, 1982413648, undefined], [2, 1085422463, undefined], [-2, 1087594050, undefined], [9999999, 3800927862, undefined], [-9999999, 1029969130, undefined], [2147483647, 2641277762, undefined], [-2147483648, 2576668564, undefined], // uints [2147483648, 2576668564, undefined], [4294967295, 1982413648, undefined], // floats // [0, 1669671676, undefined], [-0, 1366273829, undefined], [NaN, 1428788237, undefined], [Infinity, 420913893, undefined], [-Infinity, 1915664072, undefined], // [100, 3750064106, undefined], // [-100, 2463292615, undefined], // [1, 4152582287, undefined], // [-1, 3800686449, undefined], [0.5, 2677528480, undefined], [-0.5, 425809119, undefined], [1.005, 839092187, undefined], [-1.005, 225499019, undefined], [3.14159265358979323846, 2303256014, undefined], [-3.14159265358979323846, 2231227058, undefined], // [Number.MAX_SAFE_INTEGER, 3279583865, undefined], // [Number.MIN_SAFE_INTEGER, 2746207972, undefined], [Number.EPSILON, 125283782, undefined], // [Number.MAX_VALUE, 474144502, undefined], // [Number.MIN_VALUE, 1392991556, undefined], // ints [0, 2946814719, 31], [1, 29110604, 31], [-1, 631368685, 31], [2, 277044254, 31], [-2, 1788940192, 31], [9999999, 3475291916, 31], [-9999999, 3940014918, 31], [2147483647, 2000002140, 31], [-2147483648, 2571171902, 31], // uints [2147483648, 2571171902, 31], [4294967295, 631368685, 31], // floats // [0, 3059498039, 31], [-0, 2781181509, 31], [NaN, 1625948381, 31], [Infinity, 1571403501, 31], [-Infinity, 4227135485, 31], // [100, 3606535095, 31], // [-100, 966609301, 31], // [1, 2003395221, 31], // [-1, 3523196978, 31], [0.5, 3826928677, 31], [-0.5, 3280821856, 31], [1.005, 3766156859, 31], [-1.005, 253650725, 31], [3.14159265358979323846, 2422986656, 31], [-3.14159265358979323846, 2341852704, 31], // [Number.MAX_SAFE_INTEGER, 2385652387, 31], // [Number.MIN_SAFE_INTEGER, 2378236565, 31], [Number.EPSILON, 2679165630, 31], // [Number.MAX_VALUE, 3965828556, 31], // [Number.MIN_VALUE, 315204188, 31], ])('fuzzyHashNumber#%#', (key: number, result: number, seed: number | undefined) => { assert.strictEqual(fuzzyHashNumber(key, seed), result); }); }); });