要找到某个保存在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结构体分析,几图示:
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号