이 글에서는 "PHP8 기반 커널 소스 코드 분석 - 배열(3)"을 소개합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.
추천 관련 기사: "PHP8 기본 커널 소스 코드 분석 - 배열(1) " "PHP8 기본 커널 소스 코드 분석 - 배열(2) " "PHP8 기본 커널 소스 코드 분석 - 배열 (4) "
위에서는 PHP 배열의 기본 구조 구현과 인덱스의 구성 원리를 완전히 분석했습니다.
두 가지 구조인 _Bucket과 _zend_array에 의존합니다
해시를 통해 o(1)을 구현하는 복잡성 function
하지만 버킷 앞에 인덱스 배열이 있습니다. 이 인덱스 배열을 이해하면서 많은 어려움을 겪었습니다. 아래 그림은
$c =array('x'=>1,'y'=> 2,'z '=>3,'a'=>0); 배열 c
패킹된 경우 키는 바로 null입니다.
해시 값을 계산할 필요가 없습니다. 이 인덱스 배열은 h 값을 빠르게 찾는 데에만 사용됩니다. array(1,2,3) buckettypedef struct _Bucket {
zval val; //数组的值 ( 复习下 zval只有16个字节)
zend_ulong h; // key的 h 值
zend_string *key; //当数组为 hash_array时候 会用到 也就是 key的值
} Bucket;
배열 b는 0번째 배열의 값을 정의하지 않기 때문에 유효하지 않습니다. $b[1]의 내용은 'a'입니다. 여기서는 val=a(zval)을 직접 표시했습니다. 실제로는 16바이트입니다. zval에 있는 문자열 유형의 zend_string에는 이전에 배운 gc 등이 포함되어 있습니다. 모든 PHP 커널 소스 코드에는 과거를 복습하고 학습하는 데 도움이 되는 무한한 마트료시카 인형이 많이 있습니다. 새로운.
다시 돌아가 $c =array('x'=>1,'y'=>2,'z'=>3,'a'=>0);
이 h 값은 매우 큽니다. 키를 사용하여 time33을 통해 계산된 해시 값입니다. 왜 해시 값이라고 불리는지 모르겠습니다. time33을 입력하고 해시 테이블을 형성합니다
해시 테이블은 주로 저장 요소 배열과 해시 함수라는 두 부분으로 구성됩니다. 간단한 해시 함수는 나머지 방법을 사용할 수 있습니다. 예를 들어 해시 테이블의 크기가 8인 경우 해시 테이블이 배열을 초기화할 때 키의 해시 코드를 따라가서 공간을 할당합니다. 8. 얻은 값은 다음과 같습니다. 배열에 있는 요소의 인덱스입니다. 이런 식으로 키를 저장소 배열의 특정 위치에 매핑할 수 있습니다
그러나 위의 방법으로 배열을 직접 구현하는 데에는 문제가 있습니다. 배열의 요소 위치가 무작위입니다. 그리고 그것은 순서가 없습니다
PHP 배열은 순서가 있으므로 해시 함수와 요소 배열 사이에 인덱스 테이블을 추가합니다. 이 인덱스 테이블도 배열입니다. 크기는 요소가 저장된 배열과 동일합니다. 그러나 저장되는 요소 유형은 항상 정수이며, 이는 실제 저장된 배열에 요소 배열의 첨자를 저장하는 데 사용됩니다. 요소는 실제 저장된 배열에 순서대로 삽입된 다음 배열 첨자가 다음과 같이 계산됩니다. 해시 함수는 새로 추가된 인덱스에 위치를 저장합니다.
첫 번째 단계는 4를 계산한 다음 인덱스 테이블에서 -4를 찾는 것입니다. 이것이 0번째 배열이므로 인덱스 테이블에서 -4번째 배열의 값을 0으로 설정한 다음 실제 배열 테이블의 0번째 요소는 실제로 할당된 zval로 설정됩니다
해시 테이블의 서로 다른 요소의 키는 결국 계산된 해시 값이 동일할 수 있습니다. 즉, 테이블의 첨자를 가리킵니다. 동일한 인덱스 테이블이 있으면 해시 충돌이 발생합니다. 인덱스 테이블은 하나의 요소만 저장할 수 있기 때문에 PHP는 연결된 목록에서 값을 가져오는 해시 충돌을 달성하기 위해 지퍼 방법을 사용합니다. 아래 "PHP7 커널 분석 - Qin Peng" 사진을 참고하시면 됩니다
정상 상황 val.u2.next 값은 -1, 즉 해시 충돌이 발생했을 때의 초기값, 그러면 여기의 값은 이전 배열의 실제 위치 충돌을 가리킵니다.
▏이 기사는 원저자 PHP Cui Xuefeng의 동의를 받아 PHP 중국어 웹사이트에 게시되었습니다. 원본 주소: https://zhuanlan.zhihu.com/p/360952022
위 내용은 PHP8 기본 커널 소스 코드 구문 분석 - 배열(3)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!