{"ScriptPreparationCode":"const testData = new Uint8Array(216);\r\ncrypto.getRandomValues(testData);\r\n\r\nasync function webCryptoHash(data) {\r\n const hash = await crypto.subtle.digest(\u0027SHA-1\u0027, data);\r\n return new Uint8Array(hash);\r\n}\r\n\r\n// 2. FNV-1a 32-bit (extremely fast, non-cryptographic)\r\nfunction fnv1a32(data) {\r\n let hash = 0x811c9dc5;\r\n for (let i = 0; i \u003C data.length; i\u002B\u002B) {\r\n hash ^= data[i];\r\n hash \u002B= (hash \u003C\u003C 1) \u002B (hash \u003C\u003C 4) \u002B (hash \u003C\u003C 7) \u002B (hash \u003C\u003C 8) \u002B (hash \u003C\u003C 24);\r\n }\r\n return hash \u003E\u003E\u003E 0;\r\n}\r\n\r\n// 3. xxHash-like implementation (fast, non-cryptographic)\r\nfunction xxHash(data) {\r\n const PRIME32_1 = 0x9e3779b1;\r\n const PRIME32_2 = 0x85ebca77;\r\n const PRIME32_3 = 0xc2b2ae3d;\r\n \r\n let h = 0;\r\n \r\n for (let i = 0; i \u003C data.length; i \u002B= 4) {\r\n const chunk = (data[i] || 0) |\r\n ((data[i \u002B 1] || 0) \u003C\u003C 8) |\r\n ((data[i \u002B 2] || 0) \u003C\u003C 16) |\r\n ((data[i \u002B 3] || 0) \u003C\u003C 24);\r\n \r\n h = Math.imul(h \u002B Math.imul(chunk, PRIME32_1), PRIME32_2);\r\n }\r\n \r\n return h \u003E\u003E\u003E 0;\r\n}\r\n\r\n// 4. MurmurHash3-like implementation (fast, non-cryptographic)\r\nfunction murmur3(data) {\r\n const c1 = 0xcc9e2d51;\r\n const c2 = 0x1b873593;\r\n let h1 = 0;\r\n\r\n for (let i = 0; i \u003C data.length; i \u002B= 4) {\r\n let k1 = (data[i] || 0) |\r\n ((data[i \u002B 1] || 0) \u003C\u003C 8) |\r\n ((data[i \u002B 2] || 0) \u003C\u003C 16) |\r\n ((data[i \u002B 3] || 0) \u003C\u003C 24);\r\n\r\n k1 = Math.imul(k1, c1);\r\n k1 = (k1 \u003C\u003C 15) | (k1 \u003E\u003E\u003E 17);\r\n k1 = Math.imul(k1, c2);\r\n\r\n h1 ^= k1;\r\n h1 = (h1 \u003C\u003C 13) | (h1 \u003E\u003E\u003E 19);\r\n h1 = Math.imul(h1, 5) \u002B 0xe6546b64;\r\n }\r\n\r\n h1 ^= data.length;\r\n h1 ^= h1 \u003E\u003E\u003E 16;\r\n h1 = Math.imul(h1, 0x85ebca6b);\r\n h1 ^= h1 \u003E\u003E\u003E 13;\r\n h1 = Math.imul(h1, 0xc2b2ae35);\r\n h1 ^= h1 \u003E\u003E\u003E 16;\r\n\r\n return h1 \u003E\u003E\u003E 0;\r\n}\r\n\r\nfunction xxHashOptimized(data) {\r\n const PRIME32_1 = 0x9e3779b1;\r\n const PRIME32_2 = 0x85ebca77;\r\n \r\n let h = 0;\r\n let i = 0;\r\n \r\n // Process 4 items at once using a specialized loop for exactly 216 elements\r\n // 216 / 4 = 54 complete chunks\r\n while (i \u003C 216) {\r\n const chunk = data[i] |\r\n (data[i \u002B 1] \u003C\u003C 8) |\r\n (data[i \u002B 2] \u003C\u003C 16) |\r\n (data[i \u002B 3] \u003C\u003C 24);\r\n \r\n h = Math.imul(h \u002B Math.imul(chunk, PRIME32_1), PRIME32_2);\r\n i \u002B= 4;\r\n }\r\n \r\n return h \u003E\u003E\u003E 0;\r\n}\r\n\r\nfunction xxHashUnrolled(data) {\r\n const PRIME32_1 = 0x9e3779b1;\r\n const PRIME32_2 = 0x85ebca77;\r\n \r\n let h = 0;\r\n \r\n // Manually unroll the first few iterations\r\n // This removes loop overhead and helps branch prediction\r\n let chunk = data[0] | (data[1] \u003C\u003C 8) | (data[2] \u003C\u003C 16) | (data[3] \u003C\u003C 24);\r\n h = Math.imul(h \u002B Math.imul(chunk, PRIME32_1), PRIME32_2);\r\n \r\n chunk = data[4] | (data[5] \u003C\u003C 8) | (data[6] \u003C\u003C 16) | (data[7] \u003C\u003C 24);\r\n h = Math.imul(h \u002B Math.imul(chunk, PRIME32_1), PRIME32_2);\r\n \r\n chunk = data[8] | (data[9] \u003C\u003C 8) | (data[10] \u003C\u003C 16) | (data[11] \u003C\u003C 24);\r\n h = Math.imul(h \u002B Math.imul(chunk, PRIME32_1), PRIME32_2);\r\n \r\n // Process the rest in a tight loop\r\n for (let i = 12; i \u003C 216; i \u002B= 4) {\r\n chunk = data[i] | (data[i \u002B 1] \u003C\u003C 8) | (data[i \u002B 2] \u003C\u003C 16) | (data[i \u002B 3] \u003C\u003C 24);\r\n h = Math.imul(h \u002B Math.imul(chunk, PRIME32_1), PRIME32_2);\r\n }\r\n \r\n return h \u003E\u003E\u003E 0;\r\n}\r\n\r\n// Version optimized for modern JS engines\r\nfunction xxHashModern(data) {\r\n const PRIME32_1 = 0x9e3779b1;\r\n const PRIME32_2 = 0x85ebca77;\r\n \r\n let h = 0;\r\n const view = new DataView(data.buffer, data.byteOffset, data.byteLength);\r\n \r\n // Process 4 bytes at a time using DataView\r\n for (let i = 0; i \u003C 216; i \u002B= 4) {\r\n const chunk = view.getUint32(i, true); // true for little-endian\r\n h = Math.imul(h \u002B Math.imul(chunk, PRIME32_1), PRIME32_2);\r\n }\r\n \r\n return h \u003E\u003E\u003E 0;\r\n}\r\n\r\nwindow.testData = testData;\r\nwindow.webCryptoHash = webCryptoHash;\r\nwindow.fnv1a32 = fnv1a32;\r\nwindow.xxHash = xxHash;\r\nwindow.murmur3 = murmur3;\r\nwindow.xxHashOptimized = xxHashOptimized;\r\nwindow.xxHashUnrolled = xxHashUnrolled;\r\nwindow.xxHashModern = xxHashModern; ","TestCases":[{"Name":"webCryptoHash","Code":"webCryptoHash(testData).then(() =\u003E {\r\n\tdeferred.resolve();\r\n});","IsDeferred":true},{"Name":"fnv1a32","Code":"fnv1a32(testData);","IsDeferred":false},{"Name":"xxHash","Code":"xxHash(testData);","IsDeferred":false},{"Name":"murmur3","Code":"murmur3(testData);","IsDeferred":false},{"Name":"xxHashOptimized","Code":"xxHashOptimized(testData);","IsDeferred":false},{"Name":"xxHashUnrolled","Code":"xxHashUnrolled(testData);","IsDeferred":false},{"Name":"xxHashModern","Code":"xxHashModern(testData);","IsDeferred":false}]}