Re: I'm a total push-over..

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux