#c #boost #hash
#c #повысить #хэш
Вопрос:
я хочу сгенерировать уникальные хэш-ключи URL-адреса. atm я использую повышающий хэш
std::size_t seed = 0;
boost::hash_combine(seed, host);
boost::hash_combine(seed, path);
boost::hash_combine(seed, query);
boost::hash_combine(seed, fragment);
но хэш-ключи очень часто дублируются … 🙁
http://www.finanzen.de/geldanlage-boerse.html 9223372036854775807
http://www.finanzen.de/geldanlage-china.html 9223372036854775807
есть ли у кого-нибудь ПРОСТАЯ альтернатива?
Комментарии:
1. какие бывают типы
host
,path
и другие?
Ответ №1:
Я не думаю, что в этом коде ошибка. Значения хэша в этом фиктивном примере отличаются:
#include <boost/functional/hash.hpp>
#include <cstdio>
int main()
{
size_t seed = 0;
std::string s1("www.finanzen.de");
std::string s2("geldanlage-boerse.html");
std::string s3("geldanlage-china.html");
boost::hash_combine(seed, s1);
boost::hash_combine(seed, s2);
fprintf(stdout, "6lxn", seed);
seed = 0;
boost::hash_combine(seed, s1);
boost::hash_combine(seed, s3);
fprintf(stdout, "6lxn", seed);
return 0;
}
Теперь, если ваши host
, path
и т.д. … являются char*
s, и вы повторно используете эти указатели, тогда полученный вами результат имеет смысл. Нет перегрузки hash_value
for char*
. Таким образом, единственное, что войдет в вычисление, — это само значение указателя (как именно, не определено). (Смотрите в самом низу ссылки на хэш.)
Другой момент: это 9223372036854775807
значение совершенно особенное. Его шестнадцатеричное представление является:
0x7fffffffffffffff
Таким образом, у вас, вероятно, где-то есть проблема с преобразованием / переполнением, которая не видна в том, что вы опубликовали.
Комментарии:
1. хм, проблема в том, что я часто получаю 9223372036854775807 я помещаю исходный ключ в базу данных mysql, определенную bigint (20). ??
2. Можете ли вы привести несколько конкретных примеров ввода, создающего этот хэш? Также, как упоминалось ранее, типы переменных, которые вы хэшируете. (Лучшим был бы простой пример в соответствии с тем, что дал Mat.)
3. эй, проблема была с bigint.. теперь я использую unsigned bigint и он работает! СПАСИБО
Ответ №2:
Попробуйте использовать некоторые функции md5, реализованные для C