ketama consistent hashing update

Richard Jones rj at last.fm
Thu Aug 9 10:20:41 UTC 2007


Multiple hash functions are required or you lose the benefit of multiple 
points per server in the first place, for the reasons brad and russ 
mentioned. 

I'm going to give crc32 a go (for lookups and initial hashing) and see how the 
distribution looks, it's probably cheaper, and makes sense as it is more 
widely available. There was no particular reason why I used md5 over any 
other hash.

160 was chosen as the number of points per server because it showed a decent 
distribution.. it's "big enough". Once the hashing and collision handling are 
well defined, this could potentially be tuned per-install, and still maintain 
compatability between clients. However, i think we can agree on a sane 
default with a bit more testing.

I recently spotted a consistent hashing implementation in a branch of php/pecl 
memcache cvs - http://pecl.php.net/package/memcache which iirc uses crc32 
instead of md5. Need to investigate this some more.

RJ


On Wednesday 08 August 2007 13:03:37 Alex Stapleton wrote:
> Brad Fitzpatrick wrote:
> >    -- which digest algorithm(s) for the points and/or array lookup?
>
> There are a seemingly infinite array of hash functions out there but we
> already have code for CRC32 on a vast number of platforms, is there any
> particular reason – be it speed or quality – that we shouldn't continue
> to use that?
>
> >    -- how many points are put on the continuum for each target?
> >       +
> >    -- what is the input to the digest algorithm for points 1-n?
> >          e.g.:
> >          "127.0.0.1:11211-1"
> >          "127.0.0.1:11211-2"
> >          "127.0.0.1:11211-3"
> >                  ....
> >          "127.0.0.1:11211-<n>"
>
> It seems like running multiple hashes over the string seems like a bit
> of a waste of cycles. Modifying the hash value for each point would be
> much more efficient and simpler to implement. Something like point value
> = <hash value> + (<point number> * 2654435761)
>
> As Steve says in his follow-up we also need to handle collisions while
> creating the continuum. Simply incrementing the point value by 1 until
> we find an empty place is going to give us a rather biased continuum. I
> think that incrementing the point number 1 and recalculating the point
> value from that should give a better distribution while being fairly
> easy to actually implement.



-- 
Richard Jones
Last.fm Ltd. | http://www.last.fm/
Office: +44 (0) 207 780 7080


More information about the memcached mailing list