diff options
author | Bung <crc32@qq.com> | 2023-06-21 18:19:40 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-06-21 12:19:40 +0200 |
commit | 3ad2e7df1cfb0b454a96dbbc10b2684d1f53dc9b (patch) | |
tree | dc9dc2f21b045de2ee7c4cfc8818ba400912755c | |
parent | ede03782a340d9ba1315ef627f1129274a6d5722 (diff) | |
download | Nim-3ad2e7df1cfb0b454a96dbbc10b2684d1f53dc9b.tar.gz |
fix #20023 hash for generic tables (#20346)
* fix #20023 hash for generic tables * use default computation * Update lib/pure/collections/tables.nim Co-authored-by: Dan Rose <dan@digilabs.io> * Update lib/pure/collections/tables.nim Co-authored-by: Dan Rose <dan@digilabs.io> * Update lib/pure/collections/tables.nim * Update lib/pure/collections/tables.nim * Update t20023.nim --------- Co-authored-by: Dan Rose <dan@digilabs.io> Co-authored-by: Andreas Rumpf <rumpf_a@web.de>
-rw-r--r-- | lib/pure/collections/tables.nim | 15 | ||||
-rw-r--r-- | tests/stdlib/t20023.nim | 10 |
2 files changed, 25 insertions, 0 deletions
diff --git a/lib/pure/collections/tables.nim b/lib/pure/collections/tables.nim index 9ecc6b8e6..53490c911 100644 --- a/lib/pure/collections/tables.nim +++ b/lib/pure/collections/tables.nim @@ -2901,3 +2901,18 @@ iterator mvalues*[A](t: CountTableRef[A]): var int = if t.data[h].val != 0: yield t.data[h].val assert(len(t) == L, "the length of the table changed while iterating over it") + +proc hash*[K,V](s: Table[K,V]): Hash = + for p in pairs(s): + result = result xor hash(p) + result = !$result + +proc hash*[K,V](s: OrderedTable[K,V]): Hash = + for p in pairs(s): + result = result !& hash(p) + result = !$result + +proc hash*[V](s: CountTable[V]): Hash = + for p in pairs(s): + result = result xor hash(p) + result = !$result \ No newline at end of file diff --git a/tests/stdlib/t20023.nim b/tests/stdlib/t20023.nim new file mode 100644 index 000000000..8f12f8993 --- /dev/null +++ b/tests/stdlib/t20023.nim @@ -0,0 +1,10 @@ +import std/[tables, hashes, assertions] + + +let t = () +var a = toTable({t:t}) +del(a,t) +let b = default(typeof(a)) + +doAssert a==b , "tables are not equal" +doAssert hash(a) == hash(b), "table hashes are not equal" |