2017-09-22 7 views
0

crc32を32ビットPHPシステムで呼び出すと(PHP_INT_SIZEは4)、結果の整数値は負の値になります。私が32または64ビットシステムである場合でも、数値から正しいモジュロ値を取得するにはどうすればよいですか?PHPで符号付き整数から正しいモジュロ値を取得するにはどうすればよいですか?

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

問題は潜在的な負の数ですか?結果として得られるcrc32()の番号で単にabs()を呼び出し、リマインダーを取ることができます。 –

+0

@AlexHG 'abs'の問題は、例えば' -137262718'と '4157704578'が' crc32( "Hello") 'と同じ結果になるので、32ビットと64ビットのシステムで異なる戻り値を与えることです。異なるモジュロで異なる数である。 – chiborg

答えて

0

一つの可能​​な解決策は、16進数の値を生成する小数floatとして進値を変換し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

結果が負の場合は、22を追加します(22は2 32です)。まだ負の場合は、26を追加します。これは整数のサイズに関係なく機能します。整数のサイズが64の場合、結果は決して負ではありません。

関連する問題