Created
November 3, 2024 22:46
-
-
Save chrisvest/2746875eff3a4cd00a6b49a3a2ea5897 to your computer and use it in GitHub Desktop.
Java port of Polymur Hash. See https://github.com/orlp/polymur-hash
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Java port of PolymurHash 2.0. | |
Copyright (c) 2024 Chris Vest. | |
Requires Java 18 for Math.unsignedMultiplyHigh(). | |
*/ | |
/* | |
PolymurHash version 2.0 | |
Copyright (c) 2023 Orson Peters | |
This software is provided 'as-is', without any express or implied warranty. In | |
no event will the authors be held liable for any damages arising from the use of | |
this software. | |
Permission is granted to anyone to use this software for any purpose, including | |
commercial applications, and to alter it and redistribute it freely, subject to | |
the following restrictions: | |
1. The origin of this software must not be misrepresented; you must not claim | |
that you wrote the original software. If you use this software in a product, | |
an acknowledgment in the product documentation would be appreciated but is | |
not required. | |
2. Altered source versions must be plainly marked as such, and must not be | |
misrepresented as being the original software. | |
3. This notice may not be removed or altered from any source distribution. | |
*/ | |
import java.nio.ByteBuffer; | |
import java.nio.ByteOrder; | |
import java.nio.charset.StandardCharsets; | |
public final class PolymurHash { | |
public static final class Param { | |
private final long k; | |
private final long k2; | |
private final long k7; | |
private final long s; | |
private Param(long k, long k2, long k7, long s) { | |
this.k = k; | |
this.k2 = k2; | |
this.k7 = k7; | |
this.s = s; | |
} | |
} | |
public static Param init(long k_seed, long s_seed) { | |
long k; | |
long k2; | |
long k7; | |
long s = s_seed ^ POLYMUR_ARBITRARY1; // People love to pass zero. | |
// POLYMUR_POW37[i] = 37^(2^i) mod (2^61 - 1) | |
// Could be replaced by a 512 byte LUT, costs ~400 byte overhead but 2x | |
// faster seeding. However, seeding is rather rare, so I chose not to. | |
long[] POLYMUR_POW37 = new long[64]; | |
POLYMUR_POW37[0] = 37; | |
POLYMUR_POW37[32] = 559096694736811184L; | |
for (int i = 0; i < 31; ++i) { | |
POLYMUR_POW37[i + 1] = polymur_extrared611(polymur_red611(polymur_mul128(POLYMUR_POW37[i], POLYMUR_POW37[i]))); | |
POLYMUR_POW37[i + 33] = polymur_extrared611(polymur_red611(polymur_mul128(POLYMUR_POW37[i + 32], POLYMUR_POW37[i + 32]))); | |
} | |
for (; ; ) { | |
// Choose a random exponent coprime to 2^61 - 2. ~35.3% success rate. | |
k_seed += POLYMUR_ARBITRARY2; | |
long e = (k_seed >>> 3) | 1; // e < 2^61, odd. | |
if (e % 3 == 0) continue; | |
if (!(e % 5 != 0 && e % 7 != 0)) continue; | |
if (!(e % 11 != 0 && e % 13 != 0 && e % 31 != 0)) continue; | |
if (!(e % 41 != 0 && e % 61 != 0 && e % 151 != 0 && e % 331 != 0 && e % 1321 != 0)) continue; | |
// Compute k = 37^e mod 2^61 - 1. Since e is coprime with the order of | |
// the multiplicative group mod 2^61 - 1 and 37 is a generator, this | |
// results in another generator of the group. | |
long ka = 1, kb = 1; | |
for (int i = 0; e != 0; i += 2, e >>>= 2) { | |
if ((e & 1) != 0) ka = polymur_extrared611(polymur_red611(polymur_mul128(ka, POLYMUR_POW37[i]))); | |
if ((e & 2) != 0) kb = polymur_extrared611(polymur_red611(polymur_mul128(kb, POLYMUR_POW37[i + 1]))); | |
} | |
k = polymur_extrared611(polymur_red611(polymur_mul128(ka, kb))); | |
// ~46.875% success rate. Bound on k^7 needed for efficient reduction. | |
k = polymur_extrared611(k); | |
k2 = polymur_extrared611(polymur_red611(polymur_mul128(k, k))); | |
long k3 = polymur_red611(polymur_mul128(k, k2)); | |
long k4 = polymur_red611(polymur_mul128(k2, k2)); | |
k7 = polymur_extrared611(polymur_red611(polymur_mul128(k3, k4))); | |
if (k7 < (1L << 60) - (1L << 56)) break; | |
// Our key space is log2(totient(2^61 - 2) * (2^60-2^56)/2^61) ~= 57.4 bits. | |
} | |
return new Param(k, k2, k7, s); | |
} | |
public static Param init(long seed) { | |
return init(polymur_mix(seed + POLYMUR_ARBITRARY3), polymur_mix(seed + POLYMUR_ARBITRARY4)); | |
} | |
public static long hash(ByteBuffer buf, Param param, long tweak) { | |
long h = polymur_hash_poly611(buf, param, tweak); | |
return polymur_mix(h) + param.s; | |
} | |
public static long hash64(long value, Param param, long tweak) { | |
long p0 = param.k * param.k2; | |
long p1 = param.k2 + (value & 0x00ffffffffffffffL); | |
long p2 = param.k7 + (value & 0x00ffffffffffffffL); | |
long p3 = param.k + (value >>> 8); | |
long p4 = (p0 & POLYMUR_P611) + ((p0 >>> 61) | (umulh(param.k, param.k2) << 3)) + 8; | |
long p5 = p3 * p4; | |
long p6 = p1 * p2 + p5; | |
return param.s + polymur_mix(tweak + | |
(p6 & POLYMUR_P611) + | |
((p6 >>> 61) | (umulh(p1, p2) + umulh(p3, p4) + (ucmp(p6, p5) < 0 ? 1 : 0) << 3))); | |
} | |
// ---------- Hash function ---------- | |
private static final long POLYMUR_ARBITRARY1 = 0x6a09e667f3bcc908L; // Completely arbitrary, these | |
private static final long POLYMUR_ARBITRARY2 = 0xbb67ae8584caa73bL; // are taken from SHA-2, and | |
private static final long POLYMUR_ARBITRARY3 = 0x3c6ef372fe94f82bL; // are the fractional bits of | |
private static final long POLYMUR_ARBITRARY4 = 0xa54ff53a5f1d36f1L; // sqrt(p), p = 2, 3, 5, 7. | |
private static long polymur_mix(long x) { | |
// Mixing function from https://jonkagstrom.com/mx3/mx3_rev2.html. | |
x ^= x >>> 32; | |
x *= 0xe9846af9b1a615dL; | |
x ^= x >>> 32; | |
x *= 0xe9846af9b1a615dL; | |
x ^= x >>> 28; | |
return x; | |
} | |
private static long polymur_hash_poly611(ByteBuffer buf, Param p, long tweak) { | |
long m0, m1, m2, m3, m4, m5, m6; | |
long poly_acc = tweak; | |
int len = buf.remaining(); | |
boolean orderSwap = false; | |
if (buf.order() != ByteOrder.LITTLE_ENDIAN) { | |
orderSwap = true; | |
buf.order(ByteOrder.LITTLE_ENDIAN); | |
} | |
int pos = buf.position(); | |
if (len <= 7) { | |
m0 = load_0_8(buf, pos, len); | |
return poly_acc + polymur_red611(polymur_mul128(p.k + m0, p.k2 + len)); | |
} | |
long k3 = polymur_red611(polymur_mul128(p.k, p.k2)); | |
long k4 = polymur_red611(polymur_mul128(p.k2, p.k2)); | |
if (len >= 50) { | |
long k5 = polymur_extrared611(polymur_red611(polymur_mul128(p.k, k4))); | |
long k6 = polymur_extrared611(polymur_red611(polymur_mul128(p.k2, k4))); | |
k3 = polymur_extrared611(k3); | |
k4 = polymur_extrared611(k4); | |
long h = 0; | |
do { | |
m0 = buf.getLong(pos) & 0x00ffffffffffffffL; | |
m1 = buf.getLong(pos + 7) & 0x00ffffffffffffffL; | |
m2 = buf.getLong(pos + 7 * 2) & 0x00ffffffffffffffL; | |
m3 = buf.getLong(pos + 7 * 3) & 0x00ffffffffffffffL; | |
m4 = buf.getLong(pos + 7 * 4) & 0x00ffffffffffffffL; | |
m5 = buf.getLong(pos + 7 * 5) & 0x00ffffffffffffffL; | |
m6 = buf.getLong(pos + 7 * 6) & 0x00ffffffffffffffL; | |
U128 t0 = polymur_mul128(p.k + m0, k6 + m1); | |
U128 t1 = polymur_mul128(p.k2 + m2, k5 + m3); | |
U128 t2 = polymur_mul128(k3 + m4, k4 + m5); | |
U128 t3 = polymur_mul128(h + m6, p.k7); | |
U128 s = polymur_add128(polymur_add128(t0, t1), polymur_add128(t2, t3)); | |
h = polymur_red611(s); | |
len -= 49; | |
pos += 49; | |
} while (len >= 50); | |
long k14 = polymur_red611(polymur_mul128(p.k7, p.k7)); | |
long hk14 = polymur_red611(polymur_mul128(polymur_extrared611(h), k14)); | |
poly_acc += polymur_extrared611(hk14); | |
} | |
if (len >= 8) { | |
m0 = buf.getLong(pos) & 0x00ffffffffffffffL; | |
m1 = buf.getLong(pos + (len - 7) / 2) & 0x00ffffffffffffffL; | |
m2 = buf.getLong(pos + len - 8) >>> 8; | |
U128 t0 = polymur_mul128(p.k2 + m0, p.k7 + m1); | |
U128 t1 = polymur_mul128(p.k + m2, k3 + len); | |
if (len <= 21) return poly_acc + polymur_red611(polymur_add128(t0, t1)); | |
m3 = buf.getLong(pos + 7) & 0x00ffffffffffffffL; | |
m4 = buf.getLong(pos + 14) & 0x00ffffffffffffffL; | |
m5 = buf.getLong(pos + len - 21) & 0x00ffffffffffffffL; | |
m6 = buf.getLong(pos + len - 14) & 0x00ffffffffffffffL; | |
long t0r = polymur_red611(t0); | |
U128 t2 = polymur_mul128(p.k2 + m3, p.k7 + m4); | |
U128 t3 = polymur_mul128(t0r + m5, k4 + m6); | |
U128 s = polymur_add128(polymur_add128(t1, t2), t3); | |
return poly_acc + polymur_red611(s); | |
} | |
m0 = load_0_8(buf, pos, len); | |
if (orderSwap) { | |
buf.order(ByteOrder.BIG_ENDIAN); | |
} | |
return poly_acc + polymur_red611(polymur_mul128(p.k + m0, p.k2 + len)); | |
} | |
private static long load_0_8(ByteBuffer buf, int pos, int len) { | |
long r = 0; | |
for (int i = 0; i < len; i++) { | |
r |= (buf.get(pos + i) & 0xFFL) << 8 * i; | |
} | |
return r; | |
} | |
// ---------- Integer arithmetic ---------- | |
private static final long POLYMUR_P611 = ((1L << 61) - 1); | |
private record U128(long lo, long hi) { | |
} | |
private static U128 polymur_add128(U128 a, U128 b) { | |
long lo = a.lo + b.lo; | |
long hi = a.hi + b.hi + (ucmp(lo, b.lo) < 0 ? 1 : 0); | |
return new U128(lo, hi); | |
} | |
private static int ucmp(long lo, long lo1) { | |
return Long.compareUnsigned(lo, lo1); | |
} | |
private static U128 polymur_mul128(long a, long b) { | |
return new U128(a * b, umulh(a, b)); | |
} | |
private static long umulh(long a, long b) { | |
return Math.unsignedMultiplyHigh(a, b); | |
} | |
private static long polymur_red611(U128 x) { | |
return (x.lo & POLYMUR_P611) + ((x.lo >>> 61) | (x.hi << 3)); | |
} | |
private static long polymur_extrared611(long x) { | |
return (x & POLYMUR_P611) + (x >>> 61); | |
} | |
public static void main(String[] args) { | |
Param p = init(0xfedbca9876543210L); | |
long tweak = 0xabcdef0123456789L; | |
String[] POLYMUR_TEST_STRINGS = { | |
"", | |
"i", | |
"es", | |
"vca", | |
"bdxa", | |
"bbbmc", | |
"vn5719", | |
"lpvif62", | |
"1fcjgark", | |
"1jlz2nr6w", | |
"g4q6ebxvod", | |
"ehiybujo2n1", | |
"6u2990ulzi7m", | |
"c3xcb4ew8v678", | |
"bhcaqrm221pea1", | |
"oyl3iqxqr85eeve", | |
"b41kacwmnim8rup5", | |
"563ug64z3zdtlj438", | |
"3spvl57qfg4udw2l3s", | |
"297r1bqesqdhb3jd50g", | |
"kbc5btot9x1fqslddmha", | |
"r0vxw6kk8tc6pk0oxnr6m", | |
"wkgmmma9icgky3bnj5bjir", | |
"5eslfmq1w3i7wvd89ls7nvf", | |
"40ytv0ye8cq49no6ys1pdrot", | |
"p3mbto6bl36g3cx9sstyiugsd", | |
"m0ylpn0wh5krbebs0j5trzgveb", | |
"qsy8gpheo76vb8g0ivaojk1zgk4", | |
"dwqf8tpad4k3x69sah7pstrg8zxx", | |
"ls3zrsjf1o3cr5sjy7dzp98198i3y", | |
"xvhvx3wbzer9b7kr4jqg2ok9e3mv5d", | |
"yapzlwab361wvh0xf1rydn5ynqx8cz0", | |
"nj56v1p9dc7qdmcn2wksfg5kic1uegm2", | |
"hlebeoafjqtqxfwd9ge94z3ofk88c4a5x", | |
"6li8qyu0n8nwoggm4hqzqdamem5barzjyw", | |
"wj7sp7dhpfapsd8w2nzn8s7xtnro9g45x7t", | |
"ahio6so1x30oziw54ux5iojjdfvkwpw2v14d", | |
"wm6yacnl6k3kj3c6i1jeajuwmquv9yujms0wq", | |
"kzs6xfhmc4ifmstnekcze4y1l83ddvxust2r0o", | |
"ckamexupx7cmsuza9nssw6n45e7go4s3osr1903", | |
"nob5bj9tok346dg62jbfjfrhg5l6itsno2hkhfru", | |
"vgo0ko42n5jvrvnv3ddpwg8h7gkqoxbllv2fdy0no", | |
"dgs47djqzq3czo0i0v1u3d3x72vtvi3w2tsf9shx6k", | |
"8vjrw7jz90kf969txb5qrh0u5332zf5epsp8aes4aqh", | |
"3ni9vtqiq6vnxipfa2wag8vfwq2nyce1kgq5nj3razx9", | |
"u29xjkod6rtu5j5tlwkydt9khih6o2do84q6ukwlr00xf", | |
"yxxubvyxuusw827qctqr6tmm69rij5ex2zk1etps8qh61e", | |
"p7lh4mvadnp6uw0vt7bnzcbv1wjswuuc6gjmu684yznx8lp", | |
"8c27lotvnab6ra8pq9aon0w30ydyulesinew3akqrhhmm39e", | |
"ttipbm97gpk7tiog1doncalwgpb7alk16dapga2ekzjt59pv6", | |
"mbbtplseab2mgtgh8uwlhbmdrwxae3tc2mtf98bwuhmz4bfjnf", | |
"shnjeydnj8awrkz3rd69wqqd9srie4eo6gc6ylhz2ouv4t4qbar", | |
"lckl12agnpr6q5053h9v38lyk71emkvwdzrv0ic3a4a4pn3w3o4x", | |
"7927wqjo5jiecfk0bbtt6065j5jl7x0vv1mcxxxl0j1oatrom44zp", | |
"bajk3ff026vx0u7o5d7ry7w7n07sqdy4urv4psr79jp13e0mxsks1r", | |
"en6j5o90gmgj7ssbz6jv3kzdsbzczu518c3zmezkp02rtvo1s88n9pu", | |
"58fkwyf44tjnrytgplb5qfbvlwtav3zutxowoor2mklkr2up4nzpefos", | |
"cep02qfl6swv1j3mwy5kprm4p8drszchufrkyr5ejbtzgu5cti6fqab5c", | |
"lr5q0p1dljga8h4vruy1doa79hntwbdyolnh1fbe3phfk7f5rgs4815foj", | |
"hmnjq6h1sslivjzmbxbpqba29f6kvbea6n6c4sanm40nzmrxt8hm61ooq3e", | |
"ae43xxu1mqrbynmctit7m4wf02o0kf2vvw1l3y51n4cu5v5ba4dia67wf0bo", | |
"qz9ye2ur849obmm23d5tnfc3xdaeajil0gm2pz8z9psedj50h5hcwbcn8n2lo", | |
"w3xar1pzaff7fhyw6cshdgechm2pj1ebwrbkdct5xfbmxskr3937dodvky62i8", | |
"ypy5k197quc9ypqoj9kle2eky307jnnd7tu52hqhn6mo7jj1fvmi42kkgq40iy6", | |
"k1bp6qwiul8fnd6rfe42ge6gskk0jkr9fjgmuujey3kn8ie88h9qguw2gboo7i80", | |
"begb64jkzfujx7ch3ain1iixidnbhcbcglcuf7nys8eansnkewtiye9xv7s2ksuev", | |
"vf5d8vdjtwp5vo1ocb274nkl6h8vg97m4v5htfwv02tj9u68vdnteeim6q0zllxflj", | |
"dcg9osulcdw9sqaue4cfz6k990vpstoxmvwbxzhzichkhdujy36v556u7oxug51gdup", | |
"1rtgdtibcaos4ebzrbl1fkjahtbel6fyqipuu8lxfrwnggjr8wgoscfxp46wv9wjk315", | |
"r27qj342zj4anpkqpr9yqo7udnldwiqqpq667zzjgw33yia3wt2p6t221onq4pvfaywbj", | |
"2yzxskad06pt9zvjmiobfz12a3q6wqgpj4450rpxj0jvjk3cx39qo6cbpukxqsy6idqd40", | |
"813zultj26k3gn6gibolpuozgaxu8exfatf4iqqugelcf6k8dnzvsjb9s25g3gyess2uscc", | |
"i4p0jkxf3ajc02x330y3tg8l521fzootabn53ovru20ph3n17hfygaz1axs61jxipz6jac5z", | |
"5bk748kkvww7toeyeueukk2qyin2o5ohnvj7l1cqs9zgy92n6ujxg6sxdjw81hfd29nzrb4kh", | |
"uvhy62avo1wqms1rrtefth84xhnv1a59aez6r4xq0pla74036o3vznihxexwydnfjojmk6ipl6", | |
"0t0dlfopg27cqv1xp4qfgwdlivvgqz204hkh5ianbb4abgk0yjolcwhhitrcksha5s6otmps0hd", | |
"vrbhcwrmn5xbq8f518ntvmaeg89n7nh1uxebfsmd7smoog3k2w12zv0px32pf4b78er5f3pgy7b9", | |
"x5bmnefocbtxm8avt22ekuy5hcdyxh86is5fnns9ycfm7o25x9frwv9kfv2ohyd3txlc8zlg5rjjx", | |
"ttfrgnfvvj552vjymrqqd1yjlyff7vkffprnvu3co4vuah8y0s56tziih3yowm64ja810gb1sgk0um", | |
"a66t43i9vrr3cmg5qf52akuk8bxl4rm3i86rm7h5brjou9k2egrzy3h19hh8kqr2queyvrwb673qikj", | |
"mfuwhbvd88n21obpmwx273mmeqiz98qfmb04z0ute54kc1d9bbdyfbx2sc4em6t4pfektm05qs7bgc9z", | |
"x8wbm0kjpyua8wpgsejgxc06geitm1c0bxihvcwnxnif63dj7cygzk7led0z49ol6zf2xwcmf99n4osip", | |
"fvba43myr0ozab882crozdz0zx4lfl2h7xe2phfqte97g58fake2fzi87mpftz9qdmt45gm79xl43k1hji", | |
"wnr0pz08rm3j65b7pl116l59pxy6prnydf9xod1qdi3hp3lod2vuzy1v7gt2g72sejaomn5u53daxjrr9xk", | |
"bwo7nfqda6w56voyvg1nr7vkq61zi7gy0aggn6pic3gup7uy18zzsc7y5yz3ptvp5cd53i95dj521k4n6n7t", | |
"mromebynw459uydhhgcgrate6hnst5srng9knfjc02vtg1vywok3rdbw935pf1qwghnh0nibyb60l9elkmajg", | |
"59dcjawsd4kjjcceco3hphizua88l0qtrfd000iam3rnb4tmy6kzf5bhkc9ud1hsg3dd53tlsxarcl0n59081h", | |
"odgdgfkwcpz0zjcwsz9is5h4nhebzht7fqa1b4g8e2snb6bn5hu3ixyd2pk1ey5g3eab0m3aoknfi9ctkpxz07j", | |
"0ljqm7r10ns2pjo8x69oi0zuqss9y7301yd6rmex8djwrbqmvh2mbwscgj9pmrgul5ao0tvpefpe5a9cac5xbdwb", | |
"b449ak3ihp8tdrbteffru5vboeh1z63c55at3qz70p13d2fim50q8i06zjyb53i4gqzunx6rsl07jxjd9g77me1ww", | |
"oqzf6c40snvrjz4v0f4h8p0ozjfy1y4xihxwaz16vbxf3qsa805xodw8z5xq3hb7dag8fnxtlsc62150kk253i3buj", | |
"2eicp9a5aq2uycq55y7rsixlg3pfk7gyin65fghf03kks18dixbckxmbv5xnhyrir7qm8maz4rk2bi3zs9chidlhehf", | |
"7k1wyjs6fxss4e0ywqfurgop6f7y7e97f3mr5hnb0hlhqkqbqvi1e1z3qfyxc3te75r67fc4h9li06rl9zadg3v9zmz6", | |
"k3e403zdtia8i0gpodm00yaujr1w474bh3985o3csbfjp3dll4t98i5lesloo6rqjec2aycb3ttx1t6lg0cl9hrjkgheb", | |
"2fv8zdl1ljmpjbvaan0nt99tra48yjmc5pv91n1c5l8qp5pv77zwsx75ouay7bmgy2tjc1aazyu5zj7oimesavv9n2h7ky", | |
"ghxs7uejpzpbxjsdmc2w9fabrg4j4pwwbn0wjxux2luk1k0ciror4gcvww18e610u2wpczuwrcphy2xr1129vweqhhgitge", | |
"vk7wfi9hhi0j9n2grs8rxgq68kw54dbdviuxnvtwgz77h0qkbzqw7pgm7zgn21cxlxnyzigeyz2rzrj3awloq86tqe60e070", | |
"d1aot9216s547uk1rg651iscb1bjpgth5j4f6arx1902npcykk8niz3ffpbed47idgzvt4u59fyi5e0e2afpjb5gjk4rysn8j", | |
"2jef2xl4o9yub0z6jnxu8gm87g9iv9zdtu9yolvxtensjrtgplnmnuhz43nsxztk8s936k6eruckkiwc5hnch4qdzft093986x", | |
"oo70ed77jci4bgodhnyf37axrx4f8gf8qs94f4l9xi9h0jkdl2ozoi2p7q7qu1945l21dzj6rhvqearzrmblfo3ljjldj0m9fue" | |
}; | |
long[] POLYMUR_REFERENCE_VALUES = { | |
0x1a6ef9f9d6c576fbL, 0xd16d059771c65e13L, 0x5ee4e0c09f562f87L, 0x535b5311db007b0bL, | |
0xd17124f14bd16b5dL, 0xe84c87105c5b5cadL, 0xb16ce684b89df9c0L, 0x656525cace200667L, | |
0x92b460794885d16dL, 0xe6cc0fd9725b46b9L, 0xc875ade1929bc93dL, 0x68a2686ced37268aL, | |
0x1d1809fd7e7e14efL, 0x699b8f31fc40c137L, 0xd10dca2605654d2dL, 0xd6bc75cb729f18d7L, | |
0xfe0c617e7cb1bffeL, 0xf5f14c731c1b9a22L, 0x7a0382228d248631L, 0x6c3a5f49d8a48bc0L, | |
0x3606ebe637bb4ebcL, 0xeb4854d75431ad1dL, 0xfa8ff1a34793ebb0L, 0x7e46ad8e2338cc38L, | |
0xf8ff088ada3154b4L, 0x706669bf0925914fL, 0x70fc5fbcd3485aceL, 0x96fd279baed2f2abL, | |
0x6403a64c68d7bf68L, 0x3f8f532e1df472e5L, 0xbfc49c083515596fL, 0xd678a4b338fbf03bL, | |
0x127142a2f38b70a1L, 0x8a1a56fbb85b71f6L, 0x961d22b14e6f1932L, 0xa166b0326c942c30L, | |
0x0f3d837dddb86ae2L, 0x0f8164504b4ea8b1L, 0xe4f6475d5a739af4L, 0xbf535ad625c0d51fL, | |
0x47f10a5a13be50adL, 0x3dc5ce9c148969b3L, 0x8dc071fb4df8e144L, 0x9d0a83586cbed3b8L, | |
0xc4379e22f2809b99L, 0x42010c7dd7657650L, 0xcc31a6fbcdab8be8L, 0x7bad06c38400138aL, | |
0x0178b41584eb483dL, 0x78afc38d52514efcL, 0x65a57c4e59288dc7L, 0x86e7cc3e273e4e47L, | |
0xeb99661fb41a6bd2L, 0xea0979aa6cd70febL, 0xa64a347c0b8e007bL, 0x3692969270fe8fa4L, | |
0x17640c6052e26555L, 0xdf9e0fd276291357L, 0x64cca6ebf4580720L, 0xf82b33f6399c3f49L, | |
0xbe3ccb7526561379L, 0x8c796fce8509c043L, 0x9849fded8c92ce51L, 0xa0e744d838dbc4efL, | |
0x8e4602d33a961a65L, 0xda381d6727886a7eL, 0xa503a344fc066833L, 0xbf8ff5bc36d5dc7bL, | |
0x795ae9ed95bca7e9L, 0x19c80807dc900762L, 0xea7d27083e6ca641L, 0xeba7e4a637fe4fb5L, | |
0x34ac9bde50ce9087L, 0xe290dd0393f2586aL, 0xbd7074e9843d9dcaL, 0x66c17140a05887e6L, | |
0x4ad7b3e525e37f94L, 0xde0d009c18880dd6L, 0x1516bbb1caca46d3L, 0xe9c907ec28f89499L, | |
0xd677b655085e1e14L, 0xac5f949b08f29553L, 0xd353b06cb49b5503L, 0x9c25eb30ffa8cc78L, | |
0x6cf18c91658e0285L, 0x99264d2b2cc86a77L, 0x8b438cd1bb8fb65dL, 0xdfd56cf20b217732L, | |
0x71f4e35bf761bacfL, 0x87d7c01f2b11659cL, 0x95de608c3ad2653cL, 0x51b50e6996b8de93L, | |
0xd21e837b2121e8c9L, 0x73d07c7cb3fa0ba7L, 0x8113fab03cab6df3L, 0x57cdddea972cc490L, | |
0xc3df94778f1eec30L, 0x7509771e4127701eL, 0x28240c74c56f8f7cL, 0x194fa4f68aab8e27L | |
}; | |
for (int i = 0; i < POLYMUR_TEST_STRINGS.length; i++) { | |
ByteBuffer buf = ByteBuffer.wrap(POLYMUR_TEST_STRINGS[i].getBytes(StandardCharsets.US_ASCII)); | |
long hash = hash(buf, p, tweak); | |
long expected = POLYMUR_REFERENCE_VALUES[i]; | |
assert hash == expected : "Comparison failed at index " + i + " for " + hash + ", expected " + expected; | |
if (buf.remaining() == 8) { | |
hash = hash64(buf.getLong(0), p, tweak); | |
assert hash == expected : "8-byte comparison failed at index " + i + " for " + hash + ", expected " + expected; | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment