Портирование кода из Python в PHP
Задача - сделать функцию генерации хэша url, который хранится в базе данных браузера Mozilla Firefox (places.sqlite). На просторах интернета нашёл скрипт для python, вот он:
golden_ratio = 0x9E3779B9
max_int = 2**32 - 1
def rotate_left_5(value):
return ((value << 5) | (value >> 27)) & max_int
def add_to_hash(hash_value, value):
return (golden_ratio * (rotate_left_5(hash_value) ^ value)) & max_int
def hash_simple(url):
hash_value = 0
for char in url.encode('utf-8'):
hash_value = add_to_hash(hash_value, char)
return hash_value
def url_hash(url):
prefix, _ = url.split(':', 1)
return ((hash_simple(prefix) & 0x0000FFFF) << 32) + hash_simple(url)
Хотелось бы перевести его на PHP. Пока споткнулся на функции add_to_hash(hash_value, value) и hash_simple(url). Вот мой код на PHP:
function rotate_left_5($value) {
$max_int = 2**32 - 1;
return (($value << 5) | ($value >> 27)) & $max_int;
}
function add_to_hash($hash_value, $value) {
$golden_ratio = 0x9E3779B9;
$max_int = 2**32 - 1;
return ($golden_ratio * (rotate_left_5($hash_value) ^ $value)) & $max_int;
}
function hash_simple($url) {
$hash_value = 0;
$res = '';
$enc = [];
$arr = str_split($url);
foreach($arr as $key => $char) {
$enc[] = ord($char);
}
foreach ($enc as $key => $val) {
$hash_value = add_to_hash($hash_value, $val);
}
return $hash_value;
}
Начиная с функции add_to_hash(hash_value, value) возвращаемые данные в python и php начинают разниться, хотя вроде бы функции работают одинаково. Например, add_to_hash(1183413032, 116) в python возвращает значение "1847784092", а в PHP - "1847783424".
Также, пробовал то же самое написать на Javascript - там ситуация точно такая же - данные начинают расходиться.
Вообще, пока я слабо понимаю что именно происходит в этих функциях. В python я совсем по нулям. Просьба помочь разобраться, что не так и можно ли вообще данный код переложить на PHP?