Skip to content

Commit d5fe22c

Browse files
committed
Mangle hashcode bits
Code taken from scala.collection.mutable.AnyRefMap
1 parent 4d044c6 commit d5fe22c

File tree

1 file changed

+11
-4
lines changed

1 file changed

+11
-4
lines changed

compiler/src/dotty/tools/dotc/util/PerfectHashing.scala

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,17 @@ class PerfectHashing[Key](initialCapacity: Int = 8, capacityMultiple: Int = 2):
5050

5151
private final def isDense = capacity <= DenseLimit
5252

53-
/** Hashcode, by default `x.hashCode`, can be overridden */
54-
protected def hash(x: Key): Int = x.hashCode
55-
56-
/** Hashcode, by default `equals`, can be overridden */
53+
/** Hashcode, by default a post-processed versoon of `k.hashCode`,
54+
* can be overridden
55+
*/
56+
protected def hash(k: Key): Int =
57+
val h = key.hashCode
58+
// Part of the MurmurHash3 32 bit finalizer
59+
val i = (h ^ (h >>> 16)) * 0x85EBCA6B
60+
val j = (i ^ (i >>> 13)) & 0x7FFFFFFF
61+
if (j==0) 0x41081989 else j
62+
63+
/** Equality test, by default `equals`, can be overridden */
5764
protected def isEqual(x: Key, y: Key): Boolean = x.equals(y)
5865

5966
private def matches(entry: Int, k: Key) = isEqual(key(entry), k)

0 commit comments

Comments
 (0)