Javascript Java Hash (v3)

Revision 3 of this benchmark created on


Description

math.imul vs << vs * 31

Preparation HTML

<script>
function hashCode(str) {
  var hash = 0,
    i, chr;
  if (str.length === 0) return hash;
  for (i = 0; i < str.length; i++) {
    chr = str.charCodeAt(i);
    hash = ((hash << 5) - hash) + chr;
    hash |= 0; // Convert to 32bit integer
  }
  return hash;
}

function hashCodeImul(str) {
  var hash = 0,
    i, chr;
  if (str.length === 0) return hash;
  for (i = 0; i < str.length; i++) {
    chr = str.charCodeAt(i);
    hash = Math.imul(hash, 31) + chr;
    hash |= 0; // Convert to 32bit integer
  }
  return hash;
}

function hashCodeMulti(str) {
  var hash = 0,
    i, chr;
  if (str.length === 0) return hash;
  for (i = 0; i < str.length; i++) {
    chr = str.charCodeAt(i);
    hash = (hash * 31) + chr;
    hash |= 0; // Convert to 32bit integer
  }
  return hash;
}

TSH=s=>{for(var i=0,h=9;i<s.length;)h=Math.imul(h^s.charCodeAt(i++),9**9);return h^h>>>9}

const cyrb53a_beta = function(str, seed = 0) {
  let h1 = 0xdeadbeef ^ seed, h2 = 0x41c6ce57 ^ seed;
  for(let i = 0, ch; i < str.length; i++) {
    ch = str.charCodeAt(i);
    h1 = Math.imul(h1 ^ ch, 0x85ebca77);
    h2 = Math.imul(h2 ^ ch, 0xc2b2ae3d);
  }
  h1 ^= Math.imul(h1 ^ (h2 >>> 15), 0x735a2d97);
  h2 ^= Math.imul(h2 ^ (h1 >>> 15), 0xcaf649a9);
  h1 ^= h2 >>> 16; h2 ^= h1 >>> 16;
    return 2097152 * (h2 >>> 0) + (h1 >>> 11);
};
</script>

Test runner

Ready to run.

Testing in
TestOps/sec
regular
hashCode('test')
ready
imulation
hashCodeImul('test')
ready
multiplication
hashCodeMulti('test')
ready
tsh
TSH('test')
ready
cyrb53a
cyrb53a_beta('test')
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.