Rumah php教程 php手册 拉链法解决Hash节点冲突相关问题

拉链法解决Hash节点冲突相关问题

Jun 13, 2016 am 09:32 AM
hash php konflik penyimpanan Berkaitan nod selesaikan soalan

<?<span>php
</span><span>/*</span><span>
 * hash::拉链法解决hash节点存储冲突问题
 * ::2014-07-02
 * ::Small_Kind
 </span><span>*/</span>
<span>class</span><span> small_hash {
    
  </span><span>private</span> <span>$size</span> = 20;<span>//</span><span>hash节点大小</span>
  <span>private</span> <span>$zone</span> = <span>null</span>;<span>//</span><span>hash空间
    
  //实例化函数,并设置一个初始hash节点大小,如果节点大小为null,则为默认节点大小</span>
  <span>final</span> <span>public</span> <span>function</span> __construct(<span>$size</span> = <span>null</span><span>){
    </span><span>if</span>(!<span>is_null</span>(<span>$size</span>))<span>$this</span>->size = <span>$size</span>;<span>//
</span>    <span>$this</span>->zone = <span>new</span> SplFixedArray(<span>$this</span>->size);<span>//
</span><span>  }
  
  </span><span>//</span><span>times33::计算key的hash值,并进行节点大小的取模工作
  //::实现流程1、计算key长度2、循环长度,并将每个字符转换成asicc码后*33</span>
  <span>final</span> <span>private</span> <span>function</span> hash_times33(<span>$key</span><span>){
      </span><span>if</span>(<span>empty</span>(<span>$key</span>))<span>return</span> <span>false</span>;<span>//</span><span>key==>empty</span>
      <span>$strlen</span> = <span>strlen</span>(<span>$key</span><span>);
      </span><span>$hash_val</span> = 0<span>;
      </span><span>for</span>(<span>$i</span>=0;<span>$i</span><<span>$strlen</span>;<span>$i</span>++<span>){
          </span><span>$hash_val</span> += (<span>$hash_val</span> * 33) + <span>ord</span>(<span>$key</span>{<span>$i</span><span>});
      }
      </span><span>return</span> (<span>$hash_val</span> & 0x7FFFFFFF) % <span>$this</span>-><span>size;
  }
  
  </span><span>//</span><span>set::通过拉链法进行key->value对应的值设置</span>
  <span>final</span> <span>public</span> <span>function</span> set(<span>$key</span>,<span>$value</span><span>){
      </span><span>if</span>(<span>empty</span>(<span>$key</span>) || <span>empty</span>(<span>$value</span>))<span>return</span> <span>false</span>;<span>//</span><span>empty</span>
      <span>$index</span> = <span>$this</span>->hash_times33(<span>$key</span><span>);
      </span><span>//</span><span>如果不存在此节点的数据,则向该节点添加第一组数据</span>
      <span>if</span>(<span>isset</span>(<span>$this</span>->zone[<span>$index</span><span>])){
          </span><span>//</span><span>key、value、拉链对象[当该节点已存在1个或多组数据的时候,将之前的数据赋值给最新的一组data]
          //也就是说在查询时候相当于一种后进先出的原则,不断将最新的数据放在最前面,以此形成一种阶梯形式</span>
          <span>$data</span> = <span>array</span>(<span>$key</span>,<span>serialize</span>(<span>$value</span>),<span>$this</span>->zone[<span>$index</span><span>]);
      }</span><span>else</span><span>{
          </span><span>$data</span> = <span>array</span>(<span>$key</span>,<span>serialize</span>(<span>$value</span>),<span>null</span>);<span>//</span><span>key、value、拉链对象[当该节点是第一次有值的时候,拉链对象为null]</span>
<span>      }
      </span><span>return</span> <span>$this</span>->zone[<span>$index</span>] = <span>$data</span>;<span>//</span><span>最后将完整的data赋值给该节点</span>
<span>  }
  
  </span><span>//</span><span>get::通过key获取对应hash后对应的的节点,循环该对象节点,然后通过key值匹配节点中的key,并将值进行返回</span>
  <span>final</span> <span>public</span> <span>function</span> get(<span>$key</span><span>){
      </span><span>$index</span>  = <span>$this</span>->hash_times33(<span>$key</span><span>);
      </span><span>$handle</span> = <span>new</span> stdClass();<span>//</span><span>初始化一个对象</span>
      <span>$handle</span> = (<span>array</span>)<span>$this</span>->zone[<span>$index</span>];<span>//</span><span>查询该key对应的节点</span>
      <span>return</span> <span>$this</span>->for_match(<span>$key</span>,<span>$handle</span>);<span>//</span><span>将对象数组送入匹配函数进行迭代查询</span>
<span>  }
  
  </span><span>//</span><span>for_match::通过key对handle进行迭代查询,查询到了即返回,没有查询到则返回一个false</span>
  <span>final</span> <span>public</span> <span>function</span> for_match(<span>$key</span>,<span>$handle</span><span>){
      </span><span>if</span>(<span>is_array</span>(<span>$handle</span><span>)){
          </span><span>if</span>(<span>$handle</span>[0] == <span>$key</span><span>){
              </span><span>return</span> <span>unserialize</span>(<span>$handle</span>[1]);<span>//</span><span>如果找到值了,则对值进行返回</span>
          }<span>else</span><span>{
              </span><span>return</span> <span>$this</span>->for_match(<span>$key</span>,<span>$handle</span>[2]);<span>//</span><span>否则继续迭代该方法</span>
<span>          }
      }
  }
}

</span><span>$hand</span> = <span>new</span><span> small_hash();
</span><span>$hand</span>->set('Libin','WWW.BAIDU.COM'<span>);
</span><span>$hand</span>->set('d24150ddd','WWW.PHP.COM'<span>);
</span><span>var_dump</span>(<span>$hand</span>->get('Libin'<span>));
</span><span>var_dump</span>(<span>$hand</span>->get('d24150ddd'<span>));
</span>?>
Salin selepas log masuk

 

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Repo: Cara menghidupkan semula rakan sepasukan
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Konfigurasi Projek CakePHP Konfigurasi Projek CakePHP Sep 10, 2024 pm 05:25 PM

Dalam bab ini, kita akan memahami Pembolehubah Persekitaran, Konfigurasi Umum, Konfigurasi Pangkalan Data dan Konfigurasi E-mel dalam CakePHP.

Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 membawa beberapa ciri baharu, peningkatan keselamatan dan peningkatan prestasi dengan jumlah penamatan dan penyingkiran ciri yang sihat. Panduan ini menerangkan cara memasang PHP 8.4 atau naik taraf kepada PHP 8.4 pada Ubuntu, Debian, atau terbitan mereka

Tarikh dan Masa CakePHP Tarikh dan Masa CakePHP Sep 10, 2024 pm 05:27 PM

Untuk bekerja dengan tarikh dan masa dalam cakephp4, kami akan menggunakan kelas FrozenTime yang tersedia.

Muat naik Fail CakePHP Muat naik Fail CakePHP Sep 10, 2024 pm 05:27 PM

Untuk mengusahakan muat naik fail, kami akan menggunakan pembantu borang. Di sini, adalah contoh untuk muat naik fail.

Penghalaan CakePHP Penghalaan CakePHP Sep 10, 2024 pm 05:25 PM

Dalam bab ini, kita akan mempelajari topik berikut yang berkaitan dengan penghalaan ?

Bincangkan CakePHP Bincangkan CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP ialah rangka kerja sumber terbuka untuk PHP. Ia bertujuan untuk menjadikan pembangunan, penggunaan dan penyelenggaraan aplikasi lebih mudah. CakePHP adalah berdasarkan seni bina seperti MVC yang berkuasa dan mudah difahami. Model, Pandangan dan Pengawal gu

Cara Menyediakan Kod Visual Studio (Kod VS) untuk Pembangunan PHP Cara Menyediakan Kod Visual Studio (Kod VS) untuk Pembangunan PHP Dec 20, 2024 am 11:31 AM

Kod Visual Studio, juga dikenali sebagai Kod VS, ialah editor kod sumber percuma — atau persekitaran pembangunan bersepadu (IDE) — tersedia untuk semua sistem pengendalian utama. Dengan koleksi sambungan yang besar untuk banyak bahasa pengaturcaraan, Kod VS boleh menjadi c

Pengesah Mencipta CakePHP Pengesah Mencipta CakePHP Sep 10, 2024 pm 05:26 PM

Pengesah boleh dibuat dengan menambah dua baris berikut dalam pengawal.

See all articles