]> git.saurik.com Git - redis.git/commit - src/dict.c
Hash function switched to murmurhash2.
authorantirez <antirez@gmail.com>
Wed, 3 Oct 2012 17:14:46 +0000 (19:14 +0200)
committerantirez <antirez@gmail.com>
Fri, 5 Oct 2012 09:16:40 +0000 (11:16 +0200)
commit99c3338c23ba0d4ca4ecb85e0f23ff3f3c3e81f3
tree39a9d607a0f85911517245a30ba85b00cf3c7d6a
parent05e06e154332cf107d30092dddb94b6b35967ce5
Hash function switched to murmurhash2.

The previously used hash function, djbhash, is not secure against
collision attacks even when the seed is randomized as there are simple
ways to find seed-independent collisions.

The new hash function appears to be safe (or much harder to exploit at
least) in this case, and has better distribution.

Better distribution does not always means that's better. For instance in
a fast benchmark with "DEBUG POPULATE 1000000" I obtained the following
results:

    1.6 seconds with djbhash
    2.0 seconds with murmurhash2

This is due to the fact that djbhash will hash objects that follow the
pattern `prefix:<id>` and where the id is numerically near, to near
buckets. This improves the locality.

However in other access patterns with keys that have no relation
murmurhash2 has some (apparently minimal) speed advantage.

On the other hand a better distribution should significantly
improve the quality of the distribution of elements returned with
dictGetRandomKey() that is used in SPOP, SRANDMEMBER, RANDOMKEY, and
other commands.

Everything considered, and under the suspect that this commit fixes a
security issue in Redis, we are switching to the new hash function.
If some serious speed regression will be found in the future we'll be able
to step back easiliy.

This commit fixes issue #663.
src/dict.c
src/dict.h