Schnelle CRC-Algorithmus?
Ich möchte erstellen Sie eine 32-bit Zahl aus einem ASCII-string. CRC32 Algorithmus ist genau das, was ich Suche, aber ich kann es nicht verwenden, da die Tabelle es erfordert, ist viel zu groß (es ist für ein embedded-Systemen, wo Ressourcen sind SEHR selten).
Also: irgendwelche Vorschläge für ein schnelles und schlankes CRC-Algorithmus? Es spielt keine Rolle, wenn Sie Stößen ein bisschen wahrscheinlicher als mit der original-CRC32.
Dank!
CRC32 implementiert werden können, ohne lookup-Tabelle, oder mit einem 1k-byte lookup-Tabelle wenn Sie muss, ohne einen großen Geschwindigkeitsnachteil im Vergleich zu den 256k-lookup-Tabelle Variante. Beispiel bei wiki.osdev.org/CRC32. Wenn Sie wirklich müssen sparen bytes verwenden, adler32.
Was meinst du mit
Irrationale Person: Nein, ich bin zu Fragen, für source code/algorithmen! Es gibt keine Aussage in meiner Frage nach einem link gefragt, oder so...
Vielleicht auch nur fix, dass code und setzen Sie die Tabelle in flash. Die meisten linkers setzen Konstante Variablen in flash, und dieser Tage sogar die low-end-CPU-s kommt mit Abstieg Menge an OTP. Nur definieren Tabelle const.
Wenn Sie keine besonderen Anforderungen an die Qualität des hash/Prüfsumme/was auch immer, etwas sehr einfaches, wie
Was meinst du mit
ressources are VERY rare
? Weniger als 64 MB, weniger als 8 KB oder kleiner als 512byte?Irrationale Person: Nein, ich bin zu Fragen, für source code/algorithmen! Es gibt keine Aussage in meiner Frage nach einem link gefragt, oder so...
Vielleicht auch nur fix, dass code und setzen Sie die Tabelle in flash. Die meisten linkers setzen Konstante Variablen in flash, und dieser Tage sogar die low-end-CPU-s kommt mit Abstieg Menge an OTP. Nur definieren Tabelle const.
Wenn Sie keine besonderen Anforderungen an die Qualität des hash/Prüfsumme/was auch immer, etwas sehr einfaches, wie
boost::hash_combine
oder sogar nur mit XOR, könnte das gut genug sein.InformationsquelleAutor Elmi | 2015-01-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
CRC-Implementierungen verwenden Sie Tabellen für die Geschwindigkeit. Sie sind nicht erforderlich.
Hier ist eine kurze CRC32 entweder die Castagnoli Polynom (die gleiche wie die Intel-crc32-Anweisungen), oder die Ethernet-Polynom (die gleiche wie Sie im zip, gzip, etc.).
Den ersten
crc
Wert sollte null sein. Die routine aufgerufen werden kann, nacheinander mit Brocken von Daten zum aktualisieren des CRC. Können Sie entrollen der inneren Schleife für eine Geschwindigkeit, wenn Ihr compiler könnte das für Sie tun sowieso.Auch dies stellt sehr effizient, mit dem argument kommen, und der Wert zurückgegeben wird bleiben und nie verlassen das gleiche register.
Ich weiß nicht, warum alte mir vor 3 Jahren gesagt. :/
sorry - ich wusste nicht, dies war so alt! Ich habe nicht bemerkt, dass es war gebracht in meinem "stream" durch ein edit.
crc = (crc >> 1) ^ (POLY & (0 - (crc & 1)));
ist ~33% schneller bei der Kompilierung für x86 mit GCC/ICC/CLANG (104 MB/s vs. 134 MB/s). Auf dem gleichen system die slice-8 2040 MB/s und Intel-CRC32C ist 8 GB/s, so vielleicht es macht nicht viel Unterschied am Ende.InformationsquelleAutor Mark Adler
Offensichtlich die größte lookup-Tabelle Holen Sie die beste Leistung, aber Sie können jede (kleinere) Tabelle für 16,8-oder 4bit-lookups.
So dass die Tabelle Größen sind für crc32:
Den 4bit-Tisch ist vier mal langsamer als die 16-bit-Tabelle.
Was Sie verwenden sollten, hängt von Ihren Anforderungen an Geschwindigkeit.
Als Luka Rahne erwähnt, ist es eine gute Idee, um eine Tabelle in den flash Speicher, aber auf vielen Plattformen ist es nicht genug, um die
const
Stichwort.Die meisten oft Sie benötigen, um die Tabelle in einem Abschnitt platziert in flash, indem Sie Ihre linker-command-file.
InformationsquelleAutor jeb