Внутренняя функция хэш-кода PHP

Я ищу эквивалент PHP для JAVA

"SomeString".hashCode(); 

функция. Хэш-код, который я ищу, должен быть тем же, который используется для индексирования Hashmaps в PHP. Я надеюсь, что вы можете помочь мне 🙂

РЕДАКТИРОВАТЬ:

Хорошо, нашел функцию, которую я искал, написанную на 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; } 

Арх и решение github, на которые ссылается guiguoz, находятся в правильном направлении, но оба не учитывают, что PHP будет повышать преобразование целочисленного значения хэша в double, как только оно превысит 2 ^ 61. Функция java, рассчитанная с использованием фиксированных 32-разрядных знаковых значений, включает 32-разрядное арифметическое переполнение (присущее ЦП), чтобы сохранить значение как 32-разрядное целое число со знаком.

В PHP вам нужно будет вручную выполнить это арифметическое переполнение каждый раз, когда обновляется хэш:

 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 typo)

В php нет такого метода. Таким образом, вам придется реализовать правильный метод. Википедия дает алгоритм, используемый 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; } 

spl_object_hash , вероятно, наиболее близок к тому, что вы хотите, но, несмотря на имя, он действительно не возвращает хэш переданного значения, а просто внутренний уникальный идентификатор. Я не знаю, действительно ли это хэш, используемый под капотом для массивов и т. Д.

Вот мои 2 цента для реализации хэш-кода Java в 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; }; 

версия utf-8 с поддержкой emoji

 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; }