Javascript Hashing Functions - Source Code

Online Here
    /**
     * Decimal to Binary
     * Source: http://www.hscripts.com/scripts/JavaScript/decimal-binary-convertor.php
     */
    function deciToBin(arg) {
      res1 = 999;
      args = arg;
      while(args>1) {
        arg1 = parseInt(args/2);
        arg2 = args%2;
        args = arg1;
        if(res1 == 999) {
          res1 = arg2.toString();
        } else {
          res1 = arg2.toString()+res1.toString();
        }
      }
      if(args == 1 && res1 != 999) {
        res1 = args.toString()+res1.toString();
      } else if(args == 0 && res1 == 999) {
        res1 = 0;
      } else if(res1 == 999) {
        res1 = 1;
      }
      var ll = res1.length;
      while(ll%4 != 0) {
        res1 = "0"+res1;
        ll = res1.length;
      }	
      return res1;
    }


    /**
     * djb2 Hash
     * Source: http://www.cse.yorku.ca/~oz/hash.html
     */
    function djb2(s, tableSize) {
      var b = '', i, hash = 5381;

      for (i = 0; i < s.length; i++) {
        b += deciToBin(s[i].charCodeAt());
      }

      for (i = 0; i < b.length; i++) {
        if (b[i] == '1') {
          hash = ((hash << 5) + hash) + 1;
        } else {
          hash = ((hash << 5) + hash) + 0;
        }
      }

      return Math.abs(hash) % tableSize;
    }


    /**
     * Universal Hash
     */
    function universalHash(s, tableSize) {
      var b = 27183, h = 0, a = 31415;

      if (tableSize > 1) {
        for (i = 0; i < s.length; i++) {
          h = (a * h + s[i].charCodeAt()) % tableSize;
          a = ((a % tableSize) * (b % tableSize)) % (tableSize);
        }
      }

      return h;
    }


    /**
     * Simple Hash
     */
    function simpleHash(s, tableSize) {
      var i, hash = 0;

      for (i = 0; i < s.length; i++) {
        hash += (s[i].charCodeAt() * (i+1));
      }

      return Math.abs(hash) % tableSize;
    }


    /**
     * Division Hash Function
     */
    function divisionHash(s, tableSize) {
      return s.length % tableSize;
    }

    /**
     *
     */
    function main() {

      CHARS = 'qwertyuiopasdfghjklzxcvbnm';

      function randomKey() {
        var s, i, stringSize = Math.floor(Math.random()*65) + 1;
        
        for (i = 0; i < stringSize; i++) {
          s += CHARS[Math.floor(Math.random()*CHARS.length)]
        }

        return s;
      }

      var maxElements = document.getElementById('maxElements').value, tableSize = document.getElementById('tableSize').value;
      var i, k, hashTable = [], hashCode = [], html = '';

      hashCode[0] = {};
      hashCode[0].value = 0;
      hashCode[0].name = 'djb2';

      hashCode[1] = {};
      hashCode[1].value = 0;
      hashCode[1].name = 'Universal';

      hashCode[2] = {};
      hashCode[2].value = 0;
      hashCode[2].name = 'Simple';

      hashCode[3] = {};
      hashCode[3].value = 0;
      hashCode[3].name = 'Division';

      for (i = 0; i < maxElements; i++) {

        hashCode[0].value = djb2(randomKey(), tableSize);
        hashCode[1].value = universalHash(randomKey(), tableSize);
        hashCode[2].value = simpleHash(randomKey(), tableSize);
        hashCode[3].value = divisionHash(randomKey(), tableSize);

        for (k = 0; k < hashCode.length; k++) {
          try {
           hashTable[k][0]
          } catch (e) {
           hashTable[k] = [];
          }

          if (hashTable[k][hashCode[k].value] == undefined) {
            hashTable[k][hashCode[k].value] = 1;
          } else {
            hashTable[k][hashCode[k].value]++;
          }
        }
      }

      html += '

Number of Elements: '+maxElements+' / Hash Table Size: '+tableSize+'

'; for (k = 0; k < hashCode.length; k++) { html += '
'; html += '

'+hashCode[k].name+'

'; html += '
'; for (i = 0; i < tableSize; i++) { html += '

'+(hashTable[k][i] == undefined ? 0 : hashTable[k][i])+'

'; } html += '
'; html += '
'; } document.getElementById('output').innerHTML = html; }