Der beste Weg, SHA1-Hashes auf Gleichheit zu vergleichen
Frage
Ich möchte zwei SHA1-Hashes auf Gleichheit vergleichen.Was könnte der effizienteste Weg sein, dies zu tun?Derzeit versuche ich, memcmp zu verwenden.Danke.
Lösung
Nun, da Sie zur Kompilierungszeit bereits wissen, wie groß die Blöcke sind, könnten Sie Folgendes tun:
#include <cstdint>
bool is_same_sha1(const char* p, const char* q)
{
const std::uint32_t* a = (const std::uint32_t*)p;
const std::uint32_t* b = (const std::uint32_t*)q;
return a[0] == b[0] && a[1] == b[1] && a[2] == b[2]
&& a[3] == b[3] && a[4] == b[4];
}
Aber befolgen Sie meinen Rat nicht blind, das sollten Sie tun messen jede maßgeschneiderte Lösung gegen die memcmp
Lösung und verwenden Sie sie nur, wenn sie Ihnen einen erheblichen Leistungsvorteil verschafft.Es würde mich nicht einmal wundern, wenn memcmp
war immer noch schneller, weil es etwas äußerst Cleveres und Schmutziges tat.
Andere Tipps
Was ist falsch mit memcmp()
?Sie müssen jedes Byte beider Hashes vergleichen; memcmp()
wird beim ersten gefundenen Unterschied schnell scheitern;Und memcmp()
können von den Bibliotheksautoren so geschrieben werden, dass sie in Blockgrößen funktionieren, die für die Plattform eine gute Wahl sind.
std::equal
scheint die beste wette zu sein, aber der memcmp
würde auch funktionieren.
In Bezug auf Effizienz hängt es von der Implementierung ab, aber
(möglicherweise), wie die Daten definiert und dargestellt werden.