Когда я делаю crc32
вызов в 32-битной системе PHP (PHP_INT_SIZE
4), полученное целочисленное значение может быть отрицательным. Как я могу получить правильное значение по модулю из числа, независимо от того, нахожусь ли я в 32 или 64-битной системе?
function checksumChar($str) {
if(PHP_INT_SIZE > 4) {
return crc32($str) % 26;
} else {
// ???
}
}
Если результат отрицательный, добавьте 22. (22 — 232 мод 26.) Если он все еще отрицательный, добавьте 26. Это будет работать независимо от целочисленного размера. Если целочисленный размер равен 64, то результат никогда не будет отрицательным.
Одним из возможных решений будет генерирование шестнадцатеричного значения, преобразование шестнадцатеричного значения в десятичное с плавающей точкой и использование 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);
}
}
Это ужасно ужасно, но, похоже, работает. Я надеюсь, что есть лучший способ …