Re: Bob Jenkins' hashing implementation in Ruby
From:
ts <decoux@...>
Date:
2003-03-02 11:28:49 UTC
List:
ruby-core #902
>>>>> "M" == Mauricio Fern疣dez <Mauricio> writes:
>>
>> Or famous tricky code:
>>
>> if (len > 0) {
>> switch (len & 31) {
>> do {
>> case 0: key = key*65599 + *p++;
>> case 31: key = key*65599 + *p++;
>> case 30: key = key*65599 + *p++;
>> case 29: key = key*65599 + *p++;
>> case 28: key = key*65599 + *p++;
>> /* snip */
>> case 1: key = key*65599 + *p++;
>> } while ((len -= 32) > 0);
>> }
>> }
M> Why isn't that in use right now?
Well, if I'm right this is the OZ's sdbm hash and it was unrolled (in gawk)
with
if (len > 0) {
register size_t loop = (len + 8 - 1) >> 3;
switch (len & (8 - 1)) {
case 0:
do { /* All fall throughs */
HASHC;
case 7: HASHC;
case 6: HASHC;
case 5: HASHC;
case 4: HASHC;
case 3: HASHC;
case 2: HASHC;
case 1: HASHC;
} while (--loop);
}
Guy Decoux