PHP inclut des fonctions crc32()
et hash("crc32")
, mais quel est donc leur
équivalent exact en Go ?
La question
Durant le portage (en réalité, la réécriture) d’une vieille bibliothèque PHP en Go,
j’ai eu besoin de calculer une somme de contrôle CRC (cyclic redundancy check).
Dans du PHP traditionnel, le standard de fait pour cela est bien établi depuis
PHP 4: utiliser la fonction crc32
de la bibliothèque strings
, en faisant attention au bit de signe;
ou bien, de façon plus moderne mais compatible, utiliser la fonction
hash de la bibliothèque hash
, comme
dans cet exemple:
|
|
Pas de souci en vue: la bibliothèque standard Go inclut un
paquet hash/crc32
, donc ce devrait être une
utilisation directe, pas vrai ?
Problème, à la différence de PHP qui se contente de les lister ses algorithmes sur la page de la fonction hash_algos, la bibliothèque Go va un peu plus loin que celle de PHP (surprise, surprise), et documente les siens, comme ceci:
|
|
Problème, PHP n’a aucune référence aux polynômes IEEE, de Castagnoli, ni de Koopman,
listant simplement crc
et crc32
en guise de détails.
La réponse
Un rapide contrôle des valeurs de sommes permet d’identifier les équivalences:
Langage | Algorithme | Somme de Hello world |
---|---|---|
PHP | crc32 | 75883905 |
PHP | crc32b | 8bd69e52 |
Go | crc32.Castagnoli | 72b51f78 |
Go | crc32.IEEE | 8bd69e52 |
Go | crc32.Koopman | b1bcb065 |
Petit contrôle avec d’autres jeux de valeurs pour s’assurer que ce n’est pas un hasard, et le résultat est confirmé:
- le code PHP
hash(‘crc32b’, $value)
- est équivalent au code Go
crc32.ChecksumIEEE(value)
.