Pregunta

Quiero comparar dos hashes sha1 para determinar la igualdad.¿Cuál podría ser la forma más eficiente de hacer esto?Actualmente, estoy intentando usar memcmp.Gracias.

¿Fue útil?

Solución

Bueno, como ya sabes en tiempo de compilación qué tan grandes son los bloques, puedes hacer esto:

#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];
}

Pero no sigas mi consejo a ciegas, deberías medida cualquier solución personalizada contra el memcmp solución y utilícela sólo si le proporciona una ventaja de rendimiento significativa.Ni siquiera me sorprendería si memcmp Fue aún más rápido porque hizo algo extremadamente inteligente y sucio.

Otros consejos

Qué hay de malo en memcmp()?Tienes que comparar cada byte de ambos hashes; memcmp() fracasará rápidamente en la primera diferencia que encuentre;y memcmp() Los autores de la biblioteca pueden escribirlo para que funcione en tamaños de fragmentos que sean buenas opciones para la plataforma.

std::equal parece la mejor opción, pero memcmp también funcionaría. Con respecto a la eficiencia, dependerá de la implementación, pero También (posiblemente) cómo se definen y representan los datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top