Лучший способ сравнить хэши sha1 на равенство - PullRequest
0 голосов
/ 14 марта 2012

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

Ответы [ 3 ]

3 голосов
/ 14 марта 2012

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

#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 был еще быстрее, потому что он сделал что-то очень умное и грязное.

2 голосов
/ 14 марта 2012

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

2 голосов
/ 14 марта 2012

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

...