HashTable に格納されている特定のデータを検索するには、各要素がインデックスを持ち、その要素が異なります。内部に保存されているデータを検索して取得できます。インデックスは、HashTable の最後のメンバーである arKey の開始位置にある nKeyLength ロング メモリに格納されます。arKey は 1 バイトにすぎませんが、ここでは sizeof (Bucket) を適用することで、C 言語の一般的なトリック (柔軟な配列) が使用されます。 ) + nKeyLength のサイズのメモリを計算し、インデックスを arKey メンバーに保存します。
しかし、インデックスが整数の場合、その整数は文字列として扱うことができますが、PHP はこれを行わず、トリックを使用してそれを解決します。インデックスが整数の場合、PHP はインデックスを Bucket 構造体の h メンバー変数に保存し、nKeyLength を 0 に設定します。これは、これが文字列ではなく整数であることを示すため、nKeyLength が 0 より大きい場合は、 arKey Index で取得され、nKeyLength が 0 の場合、インデックスは h で取得されます。つまり、nKeyLength が 0 の場合、h メンバー変数は役に立たないのでしょうか。実際、nKeyLength が 0 より大きい場合 (インデックスが文字列の場合)、h メンバーはハッシュ関数による処理後にインデックスの値を保存します。この利点は、ハッシュ値を再計算する必要がないことです。再ハッシュするときのインデックスの。 (ハッシュ関数は整数を取得するため、ulong h に保存でき、添字として使用できます)
HashTable 構造分析、いくつかの図: