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

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

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

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

Другие вопросы по тегам