генерировать уникальные хэш-ключи URL

#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