Я создаю ключи для данных ключ-значение, взяв несколько (<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
заявления, вы получите другой хэш). Я хотел бы, чтобы это было независимым от порядка. Так:
xor
объединить параметры будет работать. Одна проблема заключается в том, что если два фрагмента данных совпадают, они будут отменены. Можете ли вы предвидеть проблемы с этим?Комментарий о том, что xor увеличит количество столкновений, верен, только если вы считаете, {1, 2}
а также {2, 1}
быть разные входы. Я полагаю, вы этого не сделаете, так как в противном случае вы не захотите хэш, независимый от порядка. Так h({1, 2}) = h({2, 1})
нет столкновения, как вы предоставляете тот же вход.
Самым простым решением является сортировка, а не использование вашей любимой хэш-функции. Это как безопасный как ваша хеш-функция (подтвердите на crypto.stackexchange.com, если вам это нужно).
Кеширование хэшей — определенно плохая идея, поскольку два равных элемента компенсируются. Добавлять их гораздо лучше, но при двух равных элементах младший значащий бит будет равен нулю (при четырех таких элементах два бита будут равны нулю и т. Д.). Это может быть приемлемым.
Обратите внимание, что любой такой метод довольно небезопасен, так как позволяет намного быстрее находить коллизии (подтверждение по запросу). Вы можете или не можете нуждаться в безопасности, но не пытайтесь изобрести безопасный метод, поскольку это практически невозможно (каждая известная хеш-функция имеет много человеко-месяцев анализа).
Других решений пока нет …