Skip to content

Instantly share code, notes, and snippets.

@blackmambahk
Last active January 26, 2022 01:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save blackmambahk/a324b47e7a3e7fddeff8 to your computer and use it in GitHub Desktop.
Save blackmambahk/a324b47e7a3e7fddeff8 to your computer and use it in GitHub Desktop.
String Hash function
//this uses a 32bit hash with a 1/100000 collison prob for a 300 string cache
//this can has hash a 5k string 15000 per sec
//so lets say about 500 messages per msec
String.prototype.hashCode = function() {
var hash = 0, i, chr, len;
if (this.length == 0) return hash;
for (i = 0, len = this.length; i < len; i++) {
chr = this.charCodeAt(i);
hash = ((hash << 5) - hash) + chr;
hash = hash && hash; // hash |= 0; Convert to 32bit integer
}
return hash;
};
@blackmambahk
Copy link
Author

We are not using the hash for security we are just using it to create a unique key for a given string.

The thing is that the although simple and fast the hash collision probability is really just too high to make a 32bit hash viable in almost all use cases.

MD5 creates a 128Bit hash which has a collision probability in the 100's of Trillions for our typical use case. iReal/FastMD5 has a very fast algorithm 240k ops per sec on the sort of string sizes we commonly use. So we can convert a complete module and template in around 2-3ms. Since this will only happen once a month and even then only on demand this is fast enough.

@ArashPartow
Copy link

A comprehensive list of general purpose hash functions and their implementations can found here:

https://www.partow.net/programming/hashfunctions/index.html

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment