Credits
Diese Herausforderung ging von @miles aus .
Erstellen Sie eine Funktion, die den CRC32-Hash einer Eingabezeichenfolge berechnet. Die Eingabe ist eine ASCII-Zeichenfolge beliebiger Länge. Die Ausgabe ist der CRC32-Hash dieser Eingabezeichenfolge.
Erläuterung
Der Algorithmus von CRC32 und anderen CRCs ist im Wesentlichen derselbe, sodass hier nur CRC3 gezeigt wird.
Erstens haben Sie das Generatorpolynom, das eigentlich eine 4-Bit-Ganzzahl [n + 1] ist (würde in CRC32 33-Bit betragen).
In diesem Beispiel ist das Generatorpolynom 1101
.
Dann haben Sie die Zeichenfolge, die gehasht werden soll, was in diesem Beispiel der Fall wäre 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^
Der Rest, der erhalten wird (21)
, wenn der Bereich 1 Null ist 001
, was das Ergebnis des CRC3-Hash ist.
Technische Daten
- Das Generatorpolynom ist
0x104C11DB7
oder0b100000100110000010001110110110111
oder4374732215
. - Die Eingabe kann eine Zeichenfolge oder eine Liste von Ganzzahlen oder ein anderes vernünftiges Format sein.
- Die Ausgabe kann eine hexadezimale Zeichenfolge, eine Ganzzahl oder ein anderes vernünftiges Format sein.
- Built-Ins, die den CRC32-Hash berechnen, sind nicht zulässig.
Tor
Es gelten die Standardregeln für Code-Golf .
Der kürzeste Code gewinnt.
Testfälle
input output (hex)
"code-golf" 147743960 08CE64D8
"jelly" 1699969158 65537886
"" 0 00000000
Antworten:
Intel x86,
34302927 BytesNimmt die Adresse des nullterminierten Strings in ESI und gibt den CRC in EBX zurück:
Demontage (AT & T-Syntax):
Vorschläge von Peter Cordes einfließen lassen, um weitere vier Bytes einzusparen. Dies setzt eine Aufrufkonvention voraus, bei der das Richtungsflag für Zeichenfolgenbefehle bei der Eingabe gelöscht wird.
Vorschlag von Peter Ferrie, Push-Literal und Pop zu verwenden, um eine Konstante zu laden und ein Byte zu sparen.
Einbeziehung des Vorschlags von Peter Ferrie, zum zweiten Byte eines
xorl %eax, %ebx
Befehls zu springen, der ein Befehl istretl
, kombiniert mit dem Ändern der Schnittstelle der Routine, um einen nullterminierten String anstelle der Länge zu verwenden, wodurch insgesamt zwei Bytes eingespart werden.quelle
cld
Insn speichern können (wie ich es in meiner adler32-Antwort getan habe ). Ist es üblich, völlig willkürliche Anrufkonventionen für asm-Antworten zuzulassen?edi
und den Zeiger aufzunehmenesi
(möglicherweise nicht null-erweitert, also möglicherweise Fudge-Dinge und erfordern Sie eine 64bit zero-extended pointer). (x32, damit Sie sicher 32-Bit-Zeiger-Mathematik verwenden können, aber immer noch die Aufrufkonvention register-args haben. Da Sie diese nicht verwendeninc
, gibt es keinen Nachteil für den Long-Modus.)edx
die Reihenfolge der Bytes umzukehren?bswap edx
ist nur 2B.shr %edx
ist 2B, genau wie Ihre Linksverschiebung mitadd %edx,%edx
. Das ist wahrscheinlich nicht hilfreich; Sofern es keine weitere Optimierung ermöglicht, sparen Sie 3B für dieshl $24, %eax
, aber Sie geben 4B fürxor %eax,%eax
am Anfang undbswap %edx
am Ende aus. Beim Nullstellen von eax können Sie den Wertcdq
auf Null setzen%edx
. Insgesamt handelt es sich also um eine Wäsche. Es würde jedoch eine bessere Leistung erbringen : Es vermeidet, dass das Teilregister bei jeder Iteration blockiert oder verlangsamt wird, wenn mit shl geschriebenal
und dann geleseneax
wird. : PGelee, 34 Bytes
Probieren Sie es online!
quelle
Rubin, 142 Bytes
Anonyme Funktion; Nimmt einen String als Eingabe, gibt eine Ganzzahl zurück.
quelle
Jelly , 23 Bytes
Die Eingabe erfolgt in Form einer Liste von ganzen Zahlen. Probieren Sie es online! oder überprüfen Sie alle Testfälle .
Wie es funktioniert
Während Jelly bitweises XOR hat, macht das Auffüllen der Eingabe mit Nullen und das Ausrichten des Polynoms mit der höchstwertigen Binärziffer diesen Ansatz, der stattdessen Bitlisten verwendet, ein bisschen kürzer.
quelle
Pyth, 42 Bytes
Testsuite.
quelle
CJam,
3736 BytesTeste es hier.
Erläuterung
quelle
q256bYb_,{(4374732215Ybf*1>.^}*Yb
spart ein paar Bytes.Pyth, 28 Bytes
Probieren Sie es online aus: Demo oder Test Suite
Erläuterung:
quelle
JavaScript (ES6), 180 Byte
Das Fehlen eines 33-Bit-XOR-Operators oder sogar eines vorzeichenlosen 32-Bit-XOR-Operators ist nicht hilfreich.
quelle
CJam, 33 Bytes
Die Eingabe erfolgt in Form einer Zeichenfolge. Probieren Sie es online!
Wie es funktioniert
quelle