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

2 に答える 2

1

ハッシュは一意である必要はありません。たとえば、多くのアルゴリズムは最初にハッシュして、実際の項目のリンク リストである「バケット」を選択します。バージョン間でハッシュ アルゴリズムが変更された可能性があります。

于 2014-03-18T17:54:20.310 に答える
1

ハッシュ関数はそうである必要はありませんbijective(ドメイン内の各要素がコドメイン内の要素に一意にマップされる 1 対 1 の対応)。それらはそうあるべきですsurjective(コドメインのすべての要素には、ドメインに対応する要素があります)が、injectiveあなたが暗示しているように、そうである必要はありません。

于 2014-03-18T18:03:55.323 に答える