This module defines the central type class
LargeHashable of this package.
A type class for computing hashes (i.e. MD5, SHA256, ...) from haskell values.
The laws of this typeclass are the following:
- If two values are equal
==, then the finally computed hashes must also be equal according to
==. However it is not required that the hashes of inequal values have to be inequal. Also note that an instance of
LargeHashabledoes not require a instance of
Eq. Using any sane algorithm the chance of a collision should be 1 / n where n is the number of different hashes possible.
- If two values are inequal
==, then the probability of a hash collision is 1/n, where n is the number of possible hashes produced by the underlying hash algorithm.
A rule of thumb: hash all information that you would also need for serializing/deserializing values of your datatype. For instance, when hashing lists, you would not only hash the list elements but also the length of the list. Consider the following datatype
data Foo = Foo [Int] [Int]
We now write an instance for LargeHashable like this
instance LargeHashable Foo where updateHash (Foo l1 l2) = updateHash l1 >> updateHash l2
If we did not hash the length of a list, then the following two values
Foo would produce identical hashes:
Foo [1,2,3]  Foo  [2,3]