32-разрядный 64-разрядный — Как я могу получить правильное значение по модулю из подписанного Int в PHP?

Когда я делаю crc32 вызов в 32-битной системе PHP (PHP_INT_SIZE 4), полученное целочисленное значение может быть отрицательным. Как я могу получить правильное значение по модулю из числа, независимо от того, нахожусь ли я в 32 или 64-битной системе?

function checksumChar($str) {
if(PHP_INT_SIZE > 4) {
return crc32($str) % 26;
} else {
// ???
}
}

0

Решение

Если результат отрицательный, добавьте 22. (22 — 232 мод 26.) Если он все еще отрицательный, добавьте 26. Это будет работать независимо от целочисленного размера. Если целочисленный размер равен 64, то результат никогда не будет отрицательным.

1

Другие решения

Одним из возможных решений будет генерирование шестнадцатеричного значения, преобразование шестнадцатеричного значения в десятичное с плавающей точкой и использование fmod,

function checksumChar($str) {
if(PHP_INT_SIZE > 4) {
return crc32($str) % 26;
} else {
$hexCRC = (hash('crc32', $str);
$floatCRC = (float) base_convert($hexCRC, 16, 10);
return (int) fmod($floatCRC, 26);
}
}

Это ужасно ужасно, но, похоже, работает. Я надеюсь, что есть лучший способ …

0