Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top