2012-01-10 2 views
5

나는 JAVA의PHP 내부 해시 코드 기능

"SomeString".hashCode(); 

함수에 PHP의 equelent 찾고 있습니다. hashCode는 PHP에서 Hashmaps를 인덱싱하는 데 사용되는 동일해야합니다. 나는 당신이 나를 도울 수 있기를 바랍니다 :)

편집 :

좋아 내가 검색 한 기능을 발견는 C로 작성 PHP 자체하지만 당신의 도움을 주셔서 감사에서 사용할 수 없습니다!

ulong zend_inline_hash_func(char *arKey, uint nKeyLength) 
{ 
     ulong $h = 5381; 
     char *arEnd = arKey + nKeyLength; 

     while (arKey < arEnd) { 
       $h += ($h << 5); 
       $h += (ulong) *arKey++; 
     } 
     return $h; 
} 

답변

6

guiguoz가 참조하는 arkh 및 github 솔루션은 올바른 방향이지만 PHP는 정수 해시를 상향 변환한다는 점을 고려하지 않습니다. 값이 2^61을 초과하면 double 값을 반환합니다. 고정 하드웨어 32 비트 부호있는 값을 사용하여 계산 된 java 함수는 32 비트 부호있는 정수로 값을 유지하기 위해 32 비트 산술 오버플로 (CPU 고유)를 포함합니다.

function overflow32($v) 
{ 
    $v = $v % 4294967296; 
    if ($v > 2147483647) return $v - 4294967296; 
    elseif ($v < -2147483648) return $v + 4294967296; 
    else return $v; 
} 

function hashCode($s) 
{ 
    $h = 0; 
    $len = strlen($s); 
    for($i = 0; $i < $len; $i++) 
    { 
     $h = overflow32(31 * $h + ord($s[$i])); 
    } 

    return $h; 
} 

: 여기에 (편집 : 보정 %의 V 오타)

+3

overflow32 방법이 잘못되었습니다 ($ v 대신 % v이고 32 비트 시스템에서는 0으로 나눕니다). 대신 $ h = 라인은'$ h = (int) (31 * $ h + ord ($ s [$ i])) & 0xffffffff;' – xryl669

+0

@ xryl669를 읽어야한다. 라인은'hashCode "153193cc3139f12e")'. -924990722 대신 3369976574를 반환합니다. – ahoo

+0

32 비트 시스템에는 여전히 적용 할 수 없습니다. – SOFe

3

PHP에서 사용할 수있는 방법은 없습니다. 따라서 올바른 방법을 구현해야합니다. Wikipedia 내가 생각 문자열에 의해 사용되는 Java.lang.hashCode에 의해 사용되는 알고리즘을 제공합니다, 그래서 여기의 빠른 PHP 버전입니다 :

<?php 
function getStringHashCode($string){ 
    $hash = 0; 
    $stringLength = strlen($string); 
    for($i = 0; $i < $stringLength; $i++){ 
    $hash = 31 * $hash + $string[$i]; 
    } 
    return $hash; 
} 
+1

이 코드에서는 thx지만 해시 맵을 작성하는 데 정확히 동일한 내부가 필요합니다. – user982911

+1

이 함수는 잘못되었습니다. https://gist.github.com/andreyknupp/5061911은 올바르게 구현되었지만 문자열에 공백이 있으면 해시가 달라집니다. – guigouz

1

spl_object_hash 아마 당신이 원하는에 가장 가까운,하지만에도 불구하고 name 실제로 전달 된 값의 해시를 반환하지 않으며 내부 고유 식별자 만 반환합니다. 배열 등을 위해 실제로 사용되는 해시인지 모르겠다.

1

구현하기위한 제 2 센트

것은 PHP, 당신은 수동으로 산술 오버 플로우에게 $ 해시가 업데이트 될 때마다 수행해야합니다 PHP에서 자바의 해시 코드 : 이모티콘 지원

/** 
* Simulates java hashCode function 
* hash a string to 32 bit 
* @param str the string to hash 
* @return hashed 32 bit integer 
*/ 
function hashCode($str) { 
    $str = (string)$str; 
    $hash = 0; 
    $len = strlen($str); 
    if ($len == 0) 
     return $hash; 

    for ($i = 0; $i < $len; $i++) { 
     $h = $hash << 5; 
     $h -= $hash; 
     $h += ord($str[$i]); 
     $hash = $h; 
     $hash &= 0xFFFFFFFF; 
    } 
    return $hash; 
}; 
1

수정 UTF-8 버전

function str_hashcode($s){ 
    $hash = 0; 
    $len = mb_strlen($s, 'UTF-8'); 
    if($len == 0) 
     return $hash; 
    for ($i = 0; $i < $len; $i++) { 
     $c = mb_substr($s, $i, 1, 'UTF-8'); 
     $cc = unpack('V', iconv('UTF-8', 'UCS-4LE', $c))[1]; 
     $hash = (($hash << 5) - $hash) + $cc; 
     $hash &= $hash; // 16bit > 32bit 
    } 
    return $hash; 
}