@@ -30,7 +30,7 @@ class PerfectHashing[Key](initialCapacity: Int = 8, capacityMultiple: Int = 2):
30
30
31
31
protected def allocate (capacity : Int ) =
32
32
keys = new Array [AnyRef ](capacity)
33
- if capacity > DenseLimit then
33
+ if ! isDense then
34
34
table = new Array [Int ](capacity * roundToPower(capacityMultiple))
35
35
36
36
private def roundToPower (n : Int ) =
@@ -50,10 +50,17 @@ class PerfectHashing[Key](initialCapacity: Int = 8, capacityMultiple: Int = 2):
50
50
51
51
private final def isDense = capacity <= DenseLimit
52
52
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 = k.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 */
57
64
protected def isEqual (x : Key , y : Key ): Boolean = x.equals(y)
58
65
59
66
private def matches (entry : Int , k : Key ) = isEqual(key(entry), k)
@@ -64,7 +71,6 @@ class PerfectHashing[Key](initialCapacity: Int = 8, capacityMultiple: Int = 2):
64
71
65
72
/** The key at index `idx` */
66
73
def key (idx : Int ) = keys(idx).asInstanceOf [Key ]
67
-
68
74
private def setKey (e : Int , k : Key ) = keys(e) = k.asInstanceOf [AnyRef ]
69
75
70
76
private def entry (idx : Int ): Int = table(idx) - 1
0 commit comments