映射函数(即:散列函数)是散列表的关键部分,它将key与value建立映射关系,一般映射函数可以根据key的哈希值与Bucket数组大小取模得到,即key->h % ht->nTableSize
,但是PHP却不是这么做的:
nIndex = key->h | ht->nTableMask;
显然位运算要比取模更快。
nTableMask
为nTableSize
的负数,即:nTableMask = -nTableSize
,因为nTableSize
等于2^n,所以nTableMask
二进制位右侧全部为0,也就保证了nIndex落在数组索引的范围之内(|nIndex| <= nTableSize
):
11111111 11111111 11111111 11111000 -8
11111111 11111111 11111111 11110000 -16
11111111 11111111 11111111 11100000 -32
11111111 11111111 11111111 11000000 -64
11111111 11111111 11111111 10000000 -128