Портирование кода из 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?


Ответы (0 шт):