DJBHash (v3)

Revision 3 of this benchmark created by Simone Gianni on


Description

Test the performance of the simplest hash function ever

Setup

// Build a lot of average length string to test on
    
    var strs=[];
    
    var strbuff = 'a';
    for (var i = 0; i < 1000; i++) {
      var lc = strbuff.charAt(strbuff.length - 1);
      if (lc == 9) {
        strbuff += 'a';
      } else if (lc == 'z') {
        strbuff = strbuff.substr(0,strbuff.length -1);
        strbuff += 'A';
      } else if (lc == 'Z') {
        strbuff = strbuff.substr(0,strbuff.length -1);
        strbuff += '0';
      } else {
        strbuff = strbuff.substr(0,strbuff.length -1);
        strbuff += String.fromCharCode(lc.charCodeAt(0)+1);
      }
      strs.push(strbuff);        
    }
    
    function DJBHash(str) {
        var hash = 5381;
        
        for(var i = 0; i < str.length; i++) {
            hash = ((hash << 5) + hash) + str.charCodeAt(i);
        }
        
        return hash;
    }
    
    var cache = {};
    function DJBCached(str) {
      if (!cache[str]) cache[str] = DJBHash(str);
      return cache[str];
    }
    
    var fnv_prime = 0x811C9DC5;
    function MathHash(grx,gry) {
      var hash = 0;
      hash += grx;
      hash *= fnv_prime;
      hash = Math.floor(hash % 0xFFFF);
      hash /= gry;
      hash *= fnv_prime;
      return hash;
    }

Test runner

Ready to run.

Testing in
TestOps/sec
DJB on randoms
//DJBHash(strs[Math.floor(Math.random() * 1000)]);
DJBHash((Math.random() * 1000000).toString(16));
ready
DJB on average
DJBHash('abcdefghijklmnopqrstuvwxyz');
ready
DJB on randoms cached
DJBCached((Math.random() * 1000000).toString(16));
ready
DJB on average cached
DJBCached('abcdefghijklmnopqrstuvwxyz');
ready
Math hash on randoms
MathHash(Math.random()*1024,Math.random()*1024)
ready

Revisions

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