Лучший способ сравнить хеши sha1 на равенство
Вопрос
Я хочу сравнить два хеша sha1 на предмет равенства.Каким может быть наиболее эффективный способ сделать это?В настоящее время я пытаюсь использовать memcmp.Спасибо.
Решение
Что ж, поскольку во время компиляции вы уже знаете размер блоков, вы можете сделать это:
#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
был еще быстрее, потому что делал что-то чрезвычайно умное и грязное.
Другие советы
Что случилось с memcmp()
?Вам нужно сравнить каждый байт обоих хешей; memcmp()
быстро потерпит неудачу при первой же обнаруженной разнице;и memcmp()
могут быть написаны авторами библиотеки для работы с размерами фрагментов, которые являются хорошим выбором для платформы.
std::equal
казалось бы, лучший вариант, но memcmp
тоже будет работать.Что касается эффективности, это будет зависеть от реализации, но также (возможно), как данные определяются и представлены.