Il modo migliore per confrontare gli hash sha1 per l'uguaglianza
Domanda
Voglio confrontare due hash SHA1 per l'uguaglianza.Cosa potrebbe essere il modo più efficace per farlo?Attualmente, sto provando usando MemCMP.Grazie.
Soluzione
Bene, dal momento che sai già in compilazione, quanto sono grandi i blocchi, potresti fare questo:
#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];
}
.
Ma non prendere il mio consiglio ciecamente, dovresti Misura Qualsiasi soluzione personalizzata contro la soluzione memcmp
e utilizzarla solo se ti dà un vantaggio prestazionali significativo.Non sarei nemmeno sorpreso se memcmp
era ancora più veloce perché ha fatto qualcosa di estremamente intelligente e sporco.
Altri suggerimenti
Cosa c'è di sbagliato con memcmp()
?Devi confrontare ogni byte di entrambi gli hash;memcmp()
fallisce rapidamente sulla prima differenza che trova;E memcmp()
può essere scritto dagli autori della biblioteca per lavorare in formati chunk che sono buone scelte per la piattaforma.
std::equal
sembrerebbe la migliore scommessa, ma anche memcmp
funzionerebbe.
Per quanto riguarda l'efficienza, dipenderà dall'attuazione, ma
Inoltre (possibilmente) come i dati sono definiti e rappresentati.