1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2025-08-27 07:52:19 +00:00

double pass hashing

This commit is contained in:
Zeno Rogue 2025-08-05 09:08:53 +02:00
parent c4af27b763
commit 08d1eeaca4

View File

@ -1854,10 +1854,14 @@ EX buckethash_t bucketer(hyperpoint h) {
if(cgi.emb->is_euc_in_product() && in_h2xe()) h /= h[2]; if(cgi.emb->is_euc_in_product() && in_h2xe()) h /= h[2];
} }
if(elliptic && make_tuple(h[0], h[1], h[2], h[3]) < make_tuple(-h[0], -h[1], -h[2], -h[3])) h = -h; if(elliptic && make_tuple(h[0], h[1], h[2], h[3]) < make_tuple(-h[0], -h[1], -h[2], -h[3])) h = -h;
hashmix(seed, bucketer(h[0])); // With one pass, e.g., (-149,9999,10000) vs (-298,19998,10000) is a hash collision,
hashmix(seed, bucketer(h[1])); // and that may happen during the rotation of a hex grid. So make two passes
hashmix(seed, bucketer(h[2])); for(int a=0; a<2; a++) {
if(MDIM == 4) hashmix(seed, bucketer(h[3])); hashmix(seed, bucketer(h[0]));
hashmix(seed, bucketer(h[1]));
hashmix(seed, bucketer(h[2]));
if(MDIM == 4) hashmix(seed, bucketer(h[3]));
}
return seed; return seed;
} }