Почему std :: Hash одинаково для разных строк? [Дубликат]

0

Почему std :: Hash имеет равный результат для разных строк? Я использовал msvc2010sp1, и я был удивлен, увидев этот результат:

int _tmain(int argc, _TCHAR* argv[])
  {
  std::string sUniqId ("IndexBuf");
  std::stringstream sStream;

  sStream << 10;
  std::string sUniqId10 (sUniqId);
  sUniqId10.append (sStream.str());
  size_t uHashStr = std::hash<std::string>()(sUniqId10);

  sStream.str("");
  sStream << 11;
  std::string sUniqId11 (sUniqId);
  sUniqId11.append(sStream.str());
  size_t uHashStr1 = std::hash<std::string>()(sUniqId11);

  sStream.str("");
  sStream << 12;
  std::string sUniqId12 (sUniqId);
  sUniqId12.append(sStream.str());
  size_t uHashStr2 = std::hash<std::string>()(sUniqId12);

  cout <<"str:  " << sUniqId10.c_str() << "\t" << "Hash1: " << uHashStr  << endl; 
  cout <<"str2: " << sUniqId11.c_str() << "\t" << "Hash2: " << uHashStr1 << endl;
  cout <<"str3: " << sUniqId12.c_str() << "\t" << "Hash3: " << uHashStr2 << endl;

  return 0;
  }

вывод:

str:  IndexBuf10        Hash1: 1286096800
str2: IndexBuf11        Hash2: 1286096800
str3: IndexBuf12        Hash3: 1286096800

Кто-нибудь знает, почему это происходит?

ps Этот пример корректно работает для msvc2013 update1

  • 4
    Дублирование? stackoverflow.com/q/7968674/420683
  • 1
    @dyp Нет, они исправили это, реализация VS2013 зацикливается на всей строке. angevad: Я не могу воспроизвести ваши результаты, используя VS2013 Update 1. Оба 32- и 64-битных компилятора выдают разные хэши для 3 строк.
Показать ещё 6 комментариев
Теги:
c++11
stl
stdhash

2 ответа

1
Лучший ответ

Хэши не обязательно должны быть уникальными. Например, во многих алгоритмах первый хэш выбирает "ведро", которое является связанным списком фактических элементов. Скорее всего, хэш-алгоритм изменился между версиями.

1

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

  • 0
    Не нужно быть сюрпризом либо. Нет ничего особенно плохого в хеш-функции, которая по какой-то причине никогда не выводит SIZE_MAX , она просто немного SIZE_MAX доступное хеш-пространство.
  • 0
    @SteveJessop: я не могу представить себе использование хеш-функции, которая ведет себя таким образом, но я полагаю, что вы правы. Я обновил свой ответ, чтобы сказать, should быть сюръективным.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню