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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top