當我在32位PHP系統上調用crc32
(PHP_INT_SIZE
爲4)時,生成的整數值可能爲負數。無論我是在32位還是64位系統上,我如何從編號中獲得正確的模數值?如何從php中的signed int獲取正確的模數值?
function checksumChar($str) {
if(PHP_INT_SIZE > 4) {
return crc32($str) % 26;
} else {
// ???
}
}
當我在32位PHP系統上調用crc32
(PHP_INT_SIZE
爲4)時,生成的整數值可能爲負數。無論我是在32位還是64位系統上,我如何從編號中獲得正確的模數值?如何從php中的signed int獲取正確的模數值?
function checksumChar($str) {
if(PHP_INT_SIZE > 4) {
return crc32($str) % 26;
} else {
// ???
}
}
一種可能的解決方案將是,以產生一個十六進制值,轉換的十六進制值作爲十進制浮點和使用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);
}
}
這是醜陋的地獄,但似乎工作。我希望有更好的方法...
如果結果是負數,請加上22.(22是2 mod 26.)如果它仍然是負數,則加上26.這將工作,不管整數大小。如果整數大小是64,那麼結果永遠不會是負數。
問題是潛在的負數?您可以簡單地在產生的crc32()號碼上調用abs(),然後進行提醒。 –
@AlexHG使用'abs'的問題是,這會給32位和64位系統帶來不同的返回值,例如'-137262718'和'4157704578'對'crc32(「Hello」)的結果相同,但是不同的模數是不同的數字。 – chiborg