Index: pkg/compiler/lib/src/util/util.dart |
diff --git a/pkg/compiler/lib/src/util/util.dart b/pkg/compiler/lib/src/util/util.dart |
index b825d186725e2571d67cd2c1b853f17df4becd2f..d26a5c372b12d9b0b507f0d0758034f31a4d7a02 100644 |
--- a/pkg/compiler/lib/src/util/util.dart |
+++ b/pkg/compiler/lib/src/util/util.dart |
@@ -14,25 +14,53 @@ export 'emptyset.dart'; |
part 'indentation.dart'; |
part 'link.dart'; |
-/// If an integer is masked by this constant, the result is guaranteed to be in |
-/// Smi range. |
-const int SMI_MASK = 0x3fffffff; |
- |
-/// Mix the bits of [value] and merge them with [existing]. |
-int mixHashCodeBits(int existing, int value) { |
- // Spread the bits of value. Try to stay in the 30-bit range to |
- // avoid overflowing into a more expensive integer representation. |
- int h = value & 0x1fffffff; |
- h += ((h & 0x3fff) << 15) ^ 0x1fffcd7d; |
- h ^= (h >> 10); |
- h += ((h & 0x3ffffff) << 3); |
- h ^= (h >> 6); |
- h += ((h & 0x7ffffff) << 2) + ((h & 0x7fff) << 14); |
- h ^= (h >> 16); |
- // Combine the two hash values. |
- int high = existing >> 15; |
- int low = existing & 0x7fff; |
- return ((high * 13) ^ (low * 997) ^ h) & SMI_MASK; |
+/// Helper functions for creating hash codes. |
+class Hashing { |
+ /// If an integer is masked by this constant, the result is guaranteed to be |
+ /// in Smi range. |
+ static const int SMI_MASK = 0x3fffffff; |
+ |
+ /// Mix the bits of [value] and merge them with [existing]. |
+ static int mixHashCodeBits(int existing, int value) { |
+ // Spread the bits of value. Try to stay in the 30-bit range to |
+ // avoid overflowing into a more expensive integer representation. |
+ int h = value & 0x1fffffff; |
+ h += ((h & 0x3fff) << 15) ^ 0x1fffcd7d; |
+ h ^= (h >> 10); |
+ h += ((h & 0x3ffffff) << 3); |
+ h ^= (h >> 6); |
+ h += ((h & 0x7ffffff) << 2) + ((h & 0x7fff) << 14); |
+ h ^= (h >> 16); |
+ // Combine the two hash values. |
+ int high = existing >> 15; |
+ int low = existing & 0x7fff; |
+ return ((high * 13) ^ (low * 997) ^ h) & SMI_MASK; |
+ } |
+ |
+ /// Mix the bits of `object.hashCode` with [existing]. |
+ static int objectHash(Object object, [int existing = 0]) { |
+ return mixHashCodeBits(existing, object.hashCode); |
+ } |
+ |
+ /// Mix the bits of the element hash codes of [list] with [existing]. |
+ static int listHash(List list, [int existing = 0]) { |
+ int h = existing; |
+ int length = list.length; |
+ for (int i = 0; i < length; i++) { |
+ h = mixHashCodeBits(h, list[i].hashCode); |
+ } |
+ return h; |
+ } |
+ |
+ /// Mix the bits of the key/value hash codes from [map] with [existing]. |
+ static int mapHash(Map map, [int existing = 0]) { |
+ int h = existing; |
+ for (var key in map.keys) { |
+ h = mixHashCodeBits(h, key.hashCode); |
+ h = mixHashCodeBits(h, map[key].hashCode); |
+ } |
+ return h; |
+ } |
} |
/** |