Skip to content

Instantly share code, notes, and snippets.

@mraleph
Created May 30, 2012 17:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save mraleph/2837822 to your computer and use it in GitHub Desktop.
Save mraleph/2837822 to your computer and use it in GitHub Desktop.
// To make the benchmark results predictable, we replace Math.random
// with a 100% deterministic alternative.
Math.random = (function() {
var seed = 49734321;
return function() {
// Robert Jenkins' 32 bit integer hash function.
seed = ((seed + 0x7ed55d16) + (seed << 12)) & 0xffffffff;
seed = ((seed ^ 0xc761c23c) ^ (seed >>> 19)) & 0xffffffff;
seed = ((seed + 0x165667b1) + (seed << 5)) & 0xffffffff;
seed = ((seed + 0xd3a2646c) ^ (seed << 9)) & 0xffffffff;
seed = ((seed + 0xfd7046c5) + (seed << 3)) & 0xffffffff;
seed = ((seed ^ 0xb55a4f09) ^ (seed >>> 16)) & 0xffffffff;
return (seed & 0xfffffff) / 0x10000000;
};
})();
var table0 = mkTable(),
table1 = mkTable(),
table2 = mkTable(),
table3 = mkTable();
function mkTable() {
var N = Math.pow(2, 32);
var t = new Int32Array(256);
for (var i = 0; i < 256; i++) {
var v = Math.random() * N;
t[i] = v | 0;
}
return t;
}
function mkKey() {
var key = new Uint8Array(20);
for (var i = 0; i < 20; i++) key[i] = (Math.random() * 256) | 0;
return key;
}
function hash(key) {
var result = 0;
for (var i = 0; i < 20; i += 4) {
var a = key[i + 0];
var b = key[i + 1];
var c = key[i + 2];
var d = key[i + 3];
result = (result + a ^ table0[a]) | 0;
result = (result + b ^ table1[b]) | 0;
result = (result + c ^ table2[c]) | 0;
result = (result + d ^ table3[d]) | 0;
}
return result;
}
var keys = new Array(100000);
for (var i = 0; i < keys.length; i++) {
keys[i] = mkKey();
}
var start = Date.now();
for (var i = 0; i < keys.length; i++) {
hash(keys[i]);
}
var end = Date.now();
print (end - start);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment