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