]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: detect hash map collision problems
authorRuss Cox <rsc@golang.org>
Sun, 24 Jun 2012 23:47:50 +0000 (19:47 -0400)
committerRuss Cox <rsc@golang.org>
Sun, 24 Jun 2012 23:47:50 +0000 (19:47 -0400)
This can only happen if the hash function we're using is getting
far more than it's fair share of collisions, but that has happened
to us repeatedly as we've expanded the allowed use cases for
hash tables (issue 1544, issue 2609, issue 2630, issue 2883, issue 3695).
Maybe this will help the next time we try something new.

R=golang-dev, r
CC=golang-dev
https://golang.org/cl/6306083

src/pkg/runtime/hashmap.c

index ea9887a19fa6224c51cc361ff2f8e22618eba204..e8965a68d5d026e6e6dae94f7d3100c12ae59bd8 100644 (file)
@@ -416,8 +416,12 @@ hash_insert_internal (MapType *t, struct hash_subtable **pst, int32 flags, hash_
                                        *pres = ins_e->data;
                                        return (1);
                                }
-                               assert (e_hash != hash || (flags & HASH_REHASH) == 0);
-                               hash += (e_hash == hash);          /* adjust hash if it collides */
+                               if (e_hash == hash) {      /* adjust hash if it collides */
+                                       assert ((flags & HASH_REHASH) == 0);
+                                       hash++;
+                                       if ((hash & HASH_MASK) == HASH_SUBHASH)
+                                               runtime·throw("runtime: map hash collision overflow");
+                               }
                                ins_e = HASH_OFFSET (ins_e, elemsize);
                                ins_i++;
                                if (e_hash <= hash) {          /* set e to insertion point */