Crédits
Ce défi provient de @miles .
Créez une fonction qui calcule le hachage CRC32 d'une chaîne d'entrée. L'entrée sera une chaîne ASCII de n'importe quelle longueur. La sortie sera le hachage CRC32 de cette chaîne d'entrée.
Explication
L'algorithme de CRC32 et d'autres CRC sont essentiellement les mêmes, donc seul CRC3 sera démontré ici.
Premièrement, vous avez le polynôme générateur, qui est en fait un entier 4 bits [n + 1] (serait 33 bits en CRC32).
Dans cet exemple, le polynôme générateur est 1101
.
Ensuite, vous aurez la chaîne à hacher, ce qui serait le cas dans cet exemple 00010010111100101011001101
.
00010010111100101011001101|000 (1) append three [n] "0"s
1101 (2) align with highest bit
00001000111100101011001101|000 (3) XOR (1) and (2)
1101 (4) align with highest bit
00000101111100101011001101|000 (5) XOR (3) and (4)
1101 (6) align with highest bit
00000011011100101011001101|000 (7) XOR (5) and (6)
1101 (8) align with highest bit
00000000001100101011001101|000 (9) XOR (7) and (8)
1101 (10) align with highest bit
00000000000001101011001101|000 (11) XOR (9) and (10)
1101 (12) align with highest bit
00000000000000000011001101|000 (13) XOR (11) and (12)
1101 (14) align with highest bit
00000000000000000000011101|000 (15) XOR (13) and (14)
1101 (16) align with highest bit
00000000000000000000000111|000 (17) XOR (15) and (16)
110 1 (18) align with highest bit
00000000000000000000000001|100 (19) XOR (17) and (18)
1 101 (20) align with highest bit
00000000000000000000000000|001 (21) XOR (19) and (20)
^--------REGION 1--------^ ^2^
Le reste obtenu à (21)
, lorsque la région 1 est nulle, ce qui est 001
, serait le résultat du hachage CRC3.
Spécifications
- Le polynôme générateur est
0x104C11DB7
, ou0b100000100110000010001110110110111
, ou4374732215
. - L'entrée peut être une chaîne ou une liste d'entiers, ou tout autre format raisonnable.
- La sortie doit être une chaîne hexadécimale ou simplement un entier, ou tout autre format raisonnable.
- Les fonctions intégrées qui calculent le hachage CRC32 ne sont pas autorisées.
Objectif
Les règles standard pour le golf de code s'appliquent.
Le code le plus court gagne.
Cas de test
input output (hex)
"code-golf" 147743960 08CE64D8
"jelly" 1699969158 65537886
"" 0 00000000
Réponses:
Intel x86,
34302927 octetsPrend l'adresse de la chaîne terminée par zéro dans ESI et renvoie le CRC dans EBX:
Démontage (syntaxe AT&T):
Intégration des suggestions de Peter Cordes pour économiser quatre octets supplémentaires. Cela suppose une convention d'appel où l'indicateur de direction pour les instructions de chaîne est effacé à l'entrée.
Intégration de la suggestion de Peter Ferrie d'utiliser littéralement push et pop pour charger une constante, économisant un octet.
Incorporation de la suggestion de Peter Ferrie de passer au deuxième octet d'une
xorl %eax, %ebx
instruction qui est uneretl
instruction, combinée à la modification de l'interface de la routine pour prendre une chaîne terminée par zéro au lieu de la longueur, économisant deux octets au total.la source
cld
insn (comme je l'ai fait dans ma réponse adler32 ). Est-il normal de permettre des conventions d'appel totalement arbitraires pour les réponses asm?edi
et le pointeuresi
(peut-être pas à extension zéro, donc peut-être fudge les choses et nécessite un Pointeur étendu zéro 64 bits). (x32 afin que vous puissiez utiliser en toute sécurité les mathématiques du pointeur 32 bits, mais avez toujours la convention d'appel register-args. Puisque vous n'utilisez pasinc
, il n'y a aucun inconvénient au mode long.)edx
ordre inverse des octets?bswap edx
est seulement 2B.shr %edx
est 2B, identique à votre décalage à gauche avecadd %edx,%edx
. Ce n'est probablement pas utile; À moins qu'il ne permette plus d'optimisation, vous économisez 3 milliards pour leshl $24, %eax
, mais vous dépensez 4 milliards pourxor %eax,%eax
au début etbswap %edx
à la fin. La mise à zéro d'Exo vous permet d'utilisercdq
à zéro%edx
, donc dans l'ensemble c'est un lavage. Il fonctionnerait mieux, cependant: il évite le blocage / ralentissement du registre partiel à chaque itération d'écrireal
puis de lireeax
avec shl. : PGelée, 34 octets
Essayez-le en ligne!
la source
Rubis, 142 octets
Fonction anonyme; prend une chaîne en entrée, retourne un entier.
la source
Gelée , 23 octets
L'entrée se présente sous la forme d'une liste d'entiers. Essayez-le en ligne! ou vérifiez tous les cas de test .
Comment ça fonctionne
Bien que Jelly ait XOR au niveau du bit, le remplissage de l'entrée avec des zéros et l'alignement du polynôme avec le chiffre binaire le plus significatif rend cette approche, qui utilise des listes de bits à la place, un peu plus courte.
la source
Pyth, 42 octets
Suite de tests.
la source
CJam,
3736 octetsTestez-le ici.
Explication
la source
q256bYb_,{(4374732215Ybf*1>.^}*Yb
enregistre quelques octets.Pyth, 28 octets
Essayez-le en ligne: Démonstration ou suite de tests
Explication:
la source
JavaScript (ES6), 180 octets
L'absence d'un opérateur XOR 33 bits, ou même d'un opérateur XOR 32 bits non signé, est inutile.
la source
CJam, 33 octets
L'entrée se présente sous la forme d'une chaîne. Essayez-le en ligne!
Comment ça fonctionne
la source