Javascript library to hash integer inputs into random-looking output.
Note: I'm no longer using this library. Instead: murmur-numbers
This is a fast, simple (non-crypto) deterministic JS hash function that takes one
or more integer inputs and returns a float in the range 0..1 (like Math.random
).
Its purpose is to produce output which (A) is reasonably well-distributed and
(B) doesn't show any obvious patterns when graphed over the inputs.
(It has not been tested for any other characteristics desirable to hash functions.)
Here.
// install with: npm install ndhash
var hash = require('ndhash')
hash(5) // 0.8459388134141277
hash(0,5) // 0.176296778517182
hash(5)==hash(5) // true
(i.e. "why are you writing a hash function instead of using one made by people smarter than you?")
I wanted a way to deterministically popluate a map (e.g. with trees),
without any obvious visual patterns in the result.
All of the existing hash functions I tried (e.g. FNV) seemed to produce
obvious patterns when graphing the output of hash(x,y)
over (x,y).
The algorithm is based on the one described here as the "Multiplication Method", attributed to Cormen, Leiserson, & Rivest (1990). This version additionally offsets the inputs (so 0 doesn't clobber the output) and repeats the process on each input, and then finally on a value accumulated from all inputs. There is no theory underlying this; it just seems to work (and seems not to work if I omit any steps).
MIT. Improvements/suggestions most welcome.