ошибка при конвертации из php в ruby - PullRequest
1 голос
/ 24 июня 2011

Привет, я пытаюсь преобразовать функцию php на языке ruby. Есть ли ошибка, потому что результаты разные Функция на языке php:

function rpHash($value) {
    $hash = 5381;
    $value = strtoupper($value);
    for($i = 0; $i < strlen($value); $i++) {
        $hash = (($hash << 5) + $hash) + ord(substr($value, $i));
    }
    return $hash;
}

Функция, которую я попытался сделать в ruby:

def real_person_hash value
    hash = 5381
    value = value.to_s.upcase
    for i in 0..(value.length - 1)
      hash = ((hash << 5) + hash) + value[i]   
    end
    hash
end

Es.
value = "nzxs"
php function returns:
2089377688
ruby function :
6384344984

Я также отметил, что значения первых 3 для циклов равны. и только в последнем цикле они становятся другими Почему?

1 Ответ

3 голосов
/ 24 июня 2011

PHP не поддерживает целочисленную арифметику произвольной длины, переполняется , а Ruby не переполняется. Вам нужно будет сделать что-то вроде

def real_person_hash value
  hash = 5381
  value = value.to_s.upcase
  for i in 0..(value.length - 1)
    hash = ((hash << 5) + hash) + value[i]
  end
  if hash < -2147483648
    -(-(hash) & 0xffffffff)
  elsif hash > 2147483647
    hash & 0xffffffff
  else
    hash
  end
end

Это дает правильное значение для "nzxs" = 2089377688

Edit: этот пост подробно объясняет аномалии переполнения целых чисел в PHP. Короче говоря, результат вашей функции зависит от того, какую реализацию PHP вы использовали. Я отредактировал функцию, чтобы вернуть эквивалент Ruby для решения, упомянутого в этом посте. Принудительное переполнение целых чисел PHP

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...