2017-09-22 7 views
0

Lorsque j'effectue un appel crc32 sur un système PHP 32 bits (PHP_INT_SIZE est 4), la valeur entière résultante peut être négative. Comment puis-je obtenir la valeur modulo correcte à partir du nombre, que je sois sur un système 32 ou 64 bits?Comment puis-je obtenir la bonne valeur modulo d'un int signé en PHP?

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

Le problème est le nombre négatif potentiel? Vous pouvez simplement appeler abs() sur le numéro crc32() et ensuite prendre le rappel. –

+0

@AlexHG Le problème avec 'abs' est que cela donnerait des valeurs de retour différentes sur les systèmes 32 et 64 bits puisque, par exemple,' -137262718' et '4157704578' sont le même résultat pour' crc32 ("Hello") ', mais sont des nombres différents avec des modulos différents. – chiborg

Répondre

0

Une solution possible serait de générer une valeur hexadécimale, convertir la valeur hexadécimale comme un flotteur décimal et utiliser 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); 
    } 
} 

C'est moche comme l'enfer mais semble fonctionner. J'espère qu'il y a une meilleure manière ...

0

Si le résultat est négatif, ajoutez 22. (22 est 2 mod 26.) Si c'est toujours négatif, ajoutez 26. Cela fonctionnera indépendamment de la taille entière . Si la taille de l'entier est 64, le résultat ne sera jamais négatif.