Лучший способ сравнить хэши sha1 на равенство

Я хочу сравнить два хэша sha1 на равенство. Что может быть наиболее эффективным способом сделать это? В настоящее время я пытаюсь использовать memcmp. Благодарю.

3 ответа

Решение

Ну, так как вы уже знаете во время компиляции, насколько велики блоки, вы можете сделать это:

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

Но не принимайте мой совет вслепую, вы должны сравнить любое индивидуальное решение с memcmp решение и использовать его, только если оно дает вам значительное преимущество в производительности. Я даже не удивлюсь, если memcmp был еще быстрее, потому что он делал что-то очень умное и грязное.

std::equal Казалось бы, лучшая ставка, но memcmp также будет работать. Что касается эффективности, это будет зависеть от реализации, но также (возможно) от того, как данные определены и представлены.

Что случилось с memcmp()? Вы должны сравнить каждый байт обоих хэшей; memcmp() быстро потерпит неудачу при первом обнаруженном разнице; а также memcmp() могут быть написаны авторами библиотеки для работы с размерами блоков, которые являются хорошим выбором для платформы.

Другие вопросы по тегам