Melhor maneira de comparar hashes sha1 quanto à igualdade
Pergunta
Quero comparar dois hashes sha1 quanto à igualdade.Qual poderia ser a maneira mais eficiente de fazer isso?Atualmente, estou tentando usar o memcmp.Obrigado.
Solução
Bem, como você já sabe em tempo de compilação o tamanho dos blocos, você poderia fazer o seguinte:
#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];
}
Mas não siga meu conselho cegamente, você deveria medir qualquer solução personalizada contra o memcmp
solução e use-a apenas se ela proporcionar uma vantagem significativa de desempenho.Eu nem ficaria surpreso se memcmp
foi ainda mais rápido porque fez algo extremamente inteligente e sujo.
Outras dicas
O que há de errado com memcmp()
?Você precisa comparar cada byte de ambos os hashes; memcmp()
falhará rapidamente na primeira diferença que encontrar;e memcmp()
pode ser escrito pelos autores da biblioteca para funcionar em tamanhos de blocos que sejam boas escolhas para a plataforma.
std::equal
parece a melhor aposta, mas a memcmp
também funcionaria.
Com relação à eficiência, dependerá da implementação, mas
Também (possivelmente) como os dados são definidos e representados.