Hi, On Sun, 27 Jan 2008, Dmitry Potapov wrote: > #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@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html