fix: replace hashBits with V8's integer hash to fix catastrophic collision for numeric keys

The old hashBits function XORed the two 32-bit halves of a double and applied
Java HashMap-style mixing, but for small integers the low bits of the double
representation are mostly zero, causing nearly all keys to map to entry zero.
This replaces it with Thomas Wang's integer hash (as used by V8's
ComputeLongHash), which properly scatters bits across the 32-bit key space.
Also updates the map_numeric benchmark to iterate 2,000,000 entries (up from
1,000,000) and adjusts the expected output in util/benchmark.py accordingly.
This commit is contained in:
Robert Nystrom
2019-07-27 20:34:07 +00:00
parent b471a4cd16
commit 5f0d1f909b
7 changed files with 29 additions and 37 deletions
+3 -3
View File
@@ -6,17 +6,17 @@ main() {
var map = {};
for (var i = 1; i <= 1000000; i++) {
for (var i = 1; i <= 2000000; i++) {
map[i] = i;
}
var sum = 0;
for (var i = 1; i <= 1000000; i++) {
for (var i = 1; i <= 2000000; i++) {
sum += map[i];
}
print(sum);
for (var i = 1; i <= 1000000; i++) {
for (var i = 1; i <= 2000000; i++) {
map.remove(i);
}
+3 -3
View File
@@ -2,17 +2,17 @@ local start = os.clock()
local map = {}
for i = 1, 1000000 do
for i = 1, 2000000 do
map[i] = i
end
local sum = 0
for i = 1, 1000000 do
for i = 1, 2000000 do
sum = sum + map[i]
end
io.write(string.format("%d\n", sum))
for i = 1, 1000000 do
for i = 1, 2000000 do
map[i] = nil
end
+3 -3
View File
@@ -6,15 +6,15 @@ start = time.clock()
map = {}
for i in range(1, 1000001):
for i in range(1, 2000001):
map[i] = i
sum = 0
for i in range(1, 1000001):
for i in range(1, 2000001):
sum = sum + map[i]
print(sum)
for i in range(1, 1000001):
for i in range(1, 2000001):
del map[i]
print("elapsed: " + str(time.clock() - start))
+3 -3
View File
@@ -2,17 +2,17 @@ start = Time.now
map = Hash.new
for i in (1..1000000)
for i in (1..2000000)
map[i] = i
end
sum = 0
for i in (1..1000000)
for i in (1..2000000)
sum = sum + map[i]
end
puts sum
for i in (1..1000000)
for i in (1..2000000)
map.delete(i)
end
+3 -3
View File
@@ -2,17 +2,17 @@ var start = System.clock
var map = {}
for (i in 1..1000000) {
for (i in 1..2000000) {
map[i] = i
}
var sum = 0
for (i in 1..1000000) {
for (i in 1..2000000) {
sum = sum + map[i]
}
System.print(sum)
for (i in 1..1000000) {
for (i in 1..2000000) {
map.remove(i)
}