From 19484a75098d43e75e3facfdd05dccefc358e43f Mon Sep 17 00:00:00 2001 From: Max Horn Date: Fri, 11 Oct 2024 14:54:29 +0200 Subject: [PATCH] Fix hashing for integer plists (#5807) --- lib/dicthf.gi | 2 +- tst/testbugfix/2024-10-11-orbit-hash.tst | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 tst/testbugfix/2024-10-11-orbit-hash.tst diff --git a/lib/dicthf.gi b/lib/dicthf.gi index e4349ac940..119d5329f6 100644 --- a/lib/dicthf.gi +++ b/lib/dicthf.gi @@ -164,7 +164,7 @@ function(m, v) if not IsPlistRep(x) then x := AsPlist(x); fi; - return HashKeyWholeBag(x, 1); + return HashKeyBag(x, 1, 0, Length(x) * GAPInfo.BytesPerVariable); end; # alternative code w/o HashKeyBag diff --git a/tst/testbugfix/2024-10-11-orbit-hash.tst b/tst/testbugfix/2024-10-11-orbit-hash.tst new file mode 100644 index 0000000000..3735537e6f --- /dev/null +++ b/tst/testbugfix/2024-10-11-orbit-hash.tst @@ -0,0 +1,20 @@ +# Fix a bug reported by Leonard Soicher caused by a bug in +# the hash function for lists of small positive integers. +gap> n:=280;; +gap> G:=OnePrimitiveGroup(NrMovedPoints,n,Size,604800*2); +J_2.2 +gap> blocks := [ [ 1, 2, 3, 28, 108, 119, 155, 198, 216, 226 ], +> [ 1, 2, 3, 118, 119, 140, 193, 213, 218, 226 ] ];; +gap> Append(blocks[2],[1..1000]); for i in [1..1000] do Remove(blocks[2]); od; +gap> Append(blocks[2],[1..1000]); for i in [1..1000] do Remove(blocks[2]); od; +gap> ForAll(blocks,IsSet); +true +gap> orb1:=Orbit(G,blocks[1],OnSets);; +gap> Length(orb1); +12096 +gap> orb2:=Orbit(G,blocks[2],OnSets);; +gap> Length(orb2); +1008 +gap> orbs:=Orbits(G,blocks,OnSets);; +gap> List(orbs,Length); # this code gave wrong results +[ 12096, 1008 ]