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

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

Jun 13, 2016 am 09:32 AM
hashphp갈등저장관련된마디해결하다질문

<?<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>?>

 

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

DVWA

DVWA

DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기