Skip to content

Commit 77c7fe7

Browse files
committed
Avoid recomputing hashes in HashMap updates
1 parent 5f63805 commit 77c7fe7

File tree

1 file changed

+5
-6
lines changed

1 file changed

+5
-6
lines changed

library/src/scala/collection/immutable/ChampHashMap.scala

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -306,8 +306,9 @@ private final class BitmapIndexedMapNode[K, +V](
306306

307307
if ((dataMap & bitpos) != 0) {
308308
val index = indexFrom(dataMap, mask, bitpos)
309-
val key0 = this.getKey(index)
310-
if (key0 == key) {
309+
val key0 = getKey(index)
310+
val key0UnimprovedHash = getHash(index)
311+
if (key0UnimprovedHash == originalHash && key0 == key) {
311312
val value0 = this.getValue(index)
312313
return (
313314
if ((key0.asInstanceOf[AnyRef] eq key.asInstanceOf[AnyRef]) && (value0.asInstanceOf[AnyRef] eq value.asInstanceOf[AnyRef]))
@@ -316,7 +317,6 @@ private final class BitmapIndexedMapNode[K, +V](
316317
)
317318
} else {
318319
val value0 = this.getValue(index)
319-
val key0UnimprovedHash = key0.##
320320
val key0Hash = improve(key0UnimprovedHash)
321321

322322
val subNodeNew = mergeTwoKeyValPairs(key0, value0, key0UnimprovedHash, key0Hash, key, value, originalHash, keyHash, shift + BitPartitionSize)
@@ -943,17 +943,16 @@ private[immutable] final class HashMapBuilder[K, V] extends Builder[(K, V), Hash
943943
if ((bm.dataMap & bitpos) != 0) {
944944
val index = indexFrom(bm.dataMap, mask, bitpos)
945945
val key0 = bm.getKey(index)
946+
val key0UnimprovedHash = bm.getHash(index)
946947

947-
if (key0 == key) {
948+
if (key0UnimprovedHash == originalHash && key0 == key) {
948949
val value0 = mapNode.getValue(index)
949950
if (!((key0.asInstanceOf[AnyRef] eq key.asInstanceOf[AnyRef]) &&
950951
(value0.asInstanceOf[AnyRef] eq value.asInstanceOf[AnyRef]))) {
951952
setValue(bm, bitpos, key, value)
952953
}
953954
} else {
954-
955955
val value0 = bm.getValue(index)
956-
val key0UnimprovedHash = key0.##
957956
val key0Hash = improve(key0UnimprovedHash)
958957

959958
val subNodeNew: MapNode[K, V] =

0 commit comments

Comments
 (0)