ホームページ  >  記事  >  バックエンド開発  >  「PHP コアテクノロジーと実践」PHP カーネルにおけるハッシュテーブル分析

「PHP コアテクノロジーと実践」PHP カーネルにおけるハッシュテーブル分析

WBOY
WBOYオリジナル
2016-06-23 13:15:25817ブラウズ

  1. HashTable は PHP の魂です。HashTable は変数テーブル、定数テーブル、関数テーブル、配列など、Zend エンジンで広範囲に使用されるため、PHP を真に理解するには HashTable を理解することが非常に重要です。
  2. PHP カーネルの HashTable のデータ構造: PHP の HashTable も二重リンク リストを維持し、この二重リンク リストは 2 つのメンバー変数 pListNext と pListLast を通じて維持されます。 メンバー変数の中で、pData と pDataStr は、保存したいメモリ ブロック アドレスを指します。通常は、malloc などのシステム コールを通じて割り当てられますが、その場合は、ポインタを保存したい場合もあります。 malloc。このようなシステム コールでメモリを割り当てると、メモリの断片化が発生します。この状況は PHP カーネルでは許容できないため、pDataPtr ポインタが表示されます。 pDataPtr のポインタは、ポインタ型のデータを保存する場合、malloc を呼び出してメモリを割り当てることなく、直接 pDataPtr メンバ変数に保存されるため、pData がデータを直接指すときのメモリ断片化の発生を防ぎます。ポインタを使用する場合、pDataPtr は NULL に設定されます。

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 に保存でき、添字として使用できます)

  1. HashTable 構造分析、いくつかの図:

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。