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

哈希函数不一定是bijective(一对一的对应关系,其中域中的每个元素都唯一地映射到 codomain 中的元素)。它们应该surjective(codomain 中的每个元素在域中都有一个相应的元素),但它们不一定是injective,正如您所暗示的那样。

于 2014-03-18T18:03:55.323 回答
1

哈希不需要是唯一的。例如,许多算法首先散列以选择一个“桶”,它是实际项目的链表。很可能哈希算法在版本之间发生了变化。

于 2014-03-18T17:54:20.310 回答