- 论坛徽章:
- 1
|
- unsigned int hash(const void* key, ccache_t* cache)
- {
- #define mix(a,b,c) \
- { \
- a -= b; a -= c; a ^= (c >> 13); \
- b -= c; b -= a; b ^= (a << 8); \
- c -= a; c -= b; c ^= (b >> 13); \
- a -= b; a -= c; a ^= (c >> 12); \
- b -= c; b -= a; b ^= (a << 16); \
- c -= a; c -= b; c ^= (b >> 5); \
- a -= b; a -= c; a ^= (c >> 3); \
- b -= c; b -= a; b ^= (a << 10); \
- c -= a; c -= b; c ^= (b >> 15); \
- }
- char *k = (char *)key;
- unsigned int a, b, c, i, len;
- unsigned int length = cache->keysize;
- for (i = 0; i < length; i++)
- k[i] = tolower(k[i]);
- len = length;
- a = b = c = 0x9e3779b9; /* the golden ratio; an arbitrary value */
- while (12 <= len)
- {
- a += (k[0] +((unsigned int)k[1] << 8) +((unsigned int)k[2] << 16) +((unsigned int)k[3] << 24));
- b += (k[4] +((unsigned int)k[5] << 8) +((unsigned int)k[6] << 16) +((unsigned int)k[7] << 24));
- c += (k[8] +((unsigned int)k[9] << 8) +((unsigned int)k[10]<< 16)+((unsigned int)k[11] << 24));
- mix(a,b,c);
- k += 12;
- len -= 12;
- }
- c += length;
- switch(len)
- {
- case 11: c+=((unsigned int)k[10] << 24);
- case 10: c+=((unsigned int)k[9] << 16);
- case 9 : c+=((unsigned int)k[8] << 8);
- case 8 : b+=((unsigned int)k[7] << 24);
- case 7 : b+=((unsigned int)k[6] << 16);
- case 6 : b+=((unsigned int)k[5] << 8);
- case 5 : b+=k[4];
- case 4 : a+=((unsigned int)k[3] << 24);
- case 3 : a+=((unsigned int)k[2] << 16);
- case 2 : a+=((unsigned int)k[1] << 8);
- case 1 : a+=k[0];
- }
- mix(a,b,c);
- return c % cache->hashitemnum;
- }
复制代码
这段代码看不懂啊。。版主能粗略的讲解一下么?
是寻找节点所在的hash表的索引吗? |
|