From 08d1eeaca411c5d4a829ee5133b8c88137371326 Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Tue, 5 Aug 2025 09:08:53 +0200 Subject: [PATCH] double pass hashing --- hyperpoint.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/hyperpoint.cpp b/hyperpoint.cpp index d0b8d14c..37859351 100644 --- a/hyperpoint.cpp +++ b/hyperpoint.cpp @@ -1854,10 +1854,14 @@ EX buckethash_t bucketer(hyperpoint h) { 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; - hashmix(seed, bucketer(h[0])); - hashmix(seed, bucketer(h[1])); - hashmix(seed, bucketer(h[2])); - if(MDIM == 4) hashmix(seed, bucketer(h[3])); + // With one pass, e.g., (-149,9999,10000) vs (-298,19998,10000) is a hash collision, + // and that may happen during the rotation of a hex grid. So make two passes + for(int a=0; a<2; a++) { + 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; }