要找到某个保存在HashTable中的数据,则是通过索引(key),每个元素都有一个索引且不同,通过索引可以找到这个元素且可取得保存在里面的数据。索引保存在HashTable的最后一个成员arKey起始位置的长nKeyLength的内存中,虽然arKey只有一个字节,但这里使用了C语言的一个常用技巧(flesible array),通过申请sizeof(Bucket)+nKeyLength大小的内存,然后把索引保存到arKey成员中。
但如果索引为整数,本来也可以把整数当成字符串处理,但PHP不这样做,而是利用一个技巧来解决。当索引为整数时,PHP把索引保存到Bucket结构体的h成员变量中,然后把nKeyLength设置为0,表示这是一个整数而不是字符串,所以当nKeyLength大于0时,可在arKey中取到索引,而当nKeyLength等于0时,就在h中取得索引,那当nKeyLength为0时h成员变量是不是没有用呢?其实不然,当nKeyLength大于0时(索引为字符串时),h成员保存的是索引经过hash函数处理之后的值,这样做的好处就是,在重hash时不用重新计算索引的hash值。(hash函数得到的是一个整形数,所以可以保存在ulong h;中,可用来做下标)
HashTable结构体分析,几图示: