Заказать независимое хеширование

Я создаю ключи для данных ключ-значение, взяв несколько (<10) фрагменты информации, которые идентифицируют данные и создают из них один хэш. Для этого я использую CryptoPP SHA256::Update функция, которая позволяет добавлять куски одновременно:

#include "sha.h"...
byte outputBuf[CryptoPP::SHA256::DIGESTSIZE];
CryptoPP::SHA256 hash;
hash.Update(pData1, lenData1); // pData* can point to int, double or std::string
hash.Update(pData2, lenData2);
...
hash.Final(outputBuf);

Я заметил, что порядок звонков Update имеет значение (т. е. если вы измените порядок двух Update заявления, вы получите другой хэш). Я хотел бы, чтобы это было независимым от порядка. Так:

  • CryptoPP предлагает способ сделать это?
  • Если нет, можете ли вы предложить альтернативный подход? До сих пор я думаю, используя xor объединить параметры будет работать. Одна проблема заключается в том, что если два фрагмента данных совпадают, они будут отменены. Можете ли вы предвидеть проблемы с этим?

1

Решение

Комментарий о том, что xor увеличит количество столкновений, верен, только если вы считаете, {1, 2} а также {2, 1} быть разные входы. Я полагаю, вы этого не сделаете, так как в противном случае вы не захотите хэш, независимый от порядка. Так h({1, 2}) = h({2, 1}) нет столкновения, как вы предоставляете тот же вход.

Самым простым решением является сортировка, а не использование вашей любимой хэш-функции. Это как безопасный как ваша хеш-функция (подтвердите на crypto.stackexchange.com, если вам это нужно).

Кеширование хэшей — определенно плохая идея, поскольку два равных элемента компенсируются. Добавлять их гораздо лучше, но при двух равных элементах младший значащий бит будет равен нулю (при четырех таких элементах два бита будут равны нулю и т. Д.). Это может быть приемлемым.

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

2

Другие решения

Других решений пока нет …