Hi,
On Sun, 27 Jan 2008, Dmitry Potapov wrote:
quoted text > #define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
>
> #define mix(a,b,c) \
> { \
> a -= c; a ^= rot(c, 4); c += b; \
> b -= a; b ^= rot(a, 6); a += c; \
> c -= b; c ^= rot(b, 8); b += a; \
> a -= c; a ^= rot(c,16); c += b; \
> b -= a; b ^= rot(a,19); a += c; \
> c -= b; c ^= rot(b, 4); b += a; \
> }
> #define final(a,b,c) \
> { \
> c ^= b; c -= rot(b,14); \
> a ^= c; a -= rot(c,11); \
> b ^= a; b -= rot(a,25); \
> c ^= b; c -= rot(b,16); \
> a ^= c; a -= rot(c,4); \
> b ^= a; b -= rot(a,14); \
> c ^= b; c -= rot(b,24); \
> }
>
> #define hash_value(x) \
> hs[hp] += (x); \
> if (++hp == 3) { \
> mix (hs[0], hs[1], hs[2]); \
> hp = 0; \
> }
> unsigned int name_hash(const char *name, unsigned size)
> {
> unsigned hp = 0;
> unsigned hs[3];
> hs[0] = hs[1] = hs[2] = 0xdeadbeef + size;
>
> do {
> unsigned char c;
> if (size >= sizeof(unsigned)) {
> unsigned val = get_unaligned_uint(name);
> if (!(val & 0x80808080)) {
> val &= ~0x20202020;
> hash_value(val);
> name += sizeof(val);
> size -= sizeof(val);
> continue;
> }
> }
>
> while (!((c = *name) & 0x80)) {
> hash_value(c & ~0x20);
> name++;
> if (!--size)
> goto done:
> }
>
> do {
> // TODO: add denormalization for Mac
> unsigned val = towupper (utf8_to_wchar(&name, &size));
> hash_value(val);
> } while (size && (*name & 0x80));
>
> } while (size);
> done:
> if (hp)
> final(a,b,c);
> return hs[2];
> }
<irony>Oh yes, let's take this one, it is so much shorter, cleaner and
overall more elegant than Linus' code.</irony>
Ciao,
Dscho
-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to
majordomo@vger.kernel.org
More majordomo info at
http://vger.kernel.org/majordomo-info.html