>  기사  >  백엔드 개발  >  PHP crc32 함정 솔루션

PHP crc32 함정 솔루션

*文
*文원래의
2017-12-27 09:42:494789검색

PHP의 crc32는 어떤 함정에 직면하게 되나요? 어떻게 해결하나요? 이번 글에서는 PHP의 crc32 함수를 사용할 때 주의해야 할 사항을 주로 소개합니다. crc32를 사용하시는 모든 분들께 도움이 되었으면 좋겠습니다.

저는 며칠 전에 테이블 분할 프로그램을 작성했습니다. 사용된 해시 알고리즘은 다음과 같습니다. 테이블 분할 기능은 다음과 같습니다.

function _getHash($username)
    {
        $hash = crc32($username) % 512;
        return $hash;
    }

    function _getTable($username)
    {
        $hash = self::_getHash($username);
        return 'user_' . $hash;
    }



먼저 로컬 32비트 윈도우 머신에서 데이터를 생성하고 삽입합니다. 해당 테이블에 넣으세요. 그런데 프로그램과 데이터를 서버(Linux의 경우 64)로 전송해 보니 해당 데이터를 찾을 수 없는 것을 발견했습니다. 조사 결과, 서버의 crc32 결과가 로컬 결과와 다른 것으로 확인되었습니다. PHP 매뉴얼을 다시 확인한 결과, crc32 인터페이스가 해당 머신과 관련이 있다는 것을 알게 되었습니다.
PHP 설명서 설명:

Because PHP's integer type is signed many crc32 checksums will result in negative integers on 32bit platforms. On 64bit installations all crc32() results will be positive integers though.


crc32에서 반환된 결과는 32비트 시스템에서 오버플로되므로 결과가 음수가 될 수 있습니다. 64비트 시스템에서는 오버플로가 없으므로 항상 양수입니다.

CRC 알고리즘은 단어 길이의 비트 수를 기준으로 계산됩니다.

crc32 함수는 php의 두 상수 참조에 따라 PHP_INT_SIZE 및 PHP_INT_MAX를 계산합니다.
이 두 상수의 정의:
정수의 단어 길이는 플랫폼에 따라 다르지만 최대값은 일반적으로 약 20억(32-32)입니다. 비트 서명됨). PHP는 부호 없는 정수를 지원하지 않습니다. 정수값의 단어 길이는 PHP_INT_SIZE 상수로 표현할 수 있습니다. PHP 4.4.0, PHP 5.0.5부터 최대값은 PHP_INT_MAX 상수로 표현할 수 있습니다.
출력 PHP_INT_SIZE: 4, PHP_INT_MAX: 2147483647(32비트 출력)
PHP_INT_SIZE: 8, PHP_INT_MAX: 9223372036854775807(64비트 출력)


관련 권장 사항:

php는 32비트 CRC를 계산합니다. string 함수 crc32()

CRC32, 충돌하기 쉽습니다. 처리 방법

PHP에서 crc32 함수를 사용하여 데이터를 확인하는 방법

위 내용은 PHP crc32 함정 솔루션의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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