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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top