2008-12-26 回答
在进行比较的时候,上面的代码采取了一定的变通。正常情况下,将需要查询的键值与查询范围内的每一个字符串键值进行比较的时候可以调用strcmp实现,对于Apache而言则就是strcasecmp。为了能够加快查找的速度,Apache中对于每一个字符串,取其前面的4个字符计算该字符串的校验码:
#define COMPUTE_KEY_CHECKSUM(key, checksum)
{
const char *k = (key);
apr_uint32_t c = (apr_uint32_t)*k;
(checksum) = c;
(checksum) <<= 8;
if (c) {
c = (apr_uint32_t)*++k;
checksum |= c;
}
(checksum) <<= 8;
if (c) {
c = (apr_uint32_t)*++k;
checksum |= c;
}
(checksum) <<= 8;
if (c) {
c = (apr_uint32_t)*++k;
checksum |= c;
}
checksum &= CASE_MASK;
}