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:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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))
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user