Лучший способ сравнить хэши 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()
могут быть написаны авторами библиотеки для работы с размерами блоков, которые являются хорошим выбором для платформы.