为什么std::Hash对于不同的字符串是相等的
Why std::Hash equal for differen strings?
为什么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
有人知道为什么会这样吗?
注。此示例在msvc2013 update1
哈希值不需要唯一。例如,许多算法首先散列选择一个"桶",这是一个实际项目的链表。很可能哈希算法在不同版本之间发生了变化
哈希函数不必是bijective
(域中的每个元素唯一映射到上域中的元素的一对一对应)。它们应该是surjective
(上域中的每个元素在域中都有相应的元素),但它们不一定是injective
,就像您暗示的那样。
相关文章:
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 在Linux和C++中的Windows上,散列字符串值会产生不同的输出
- 为什么字符串比较的 == 运算符相对于任一字符串长度线性时间(似乎)?
- 如何泛化作用于不同类型的向量的函数?
- 由于相同的文件名/类名存在于不同的SO中而导致的SEG错误
- 返回字符串和不同向量数据类型的映射C++
- C 将字符串变成不同的数据类型变量
- 将相同的功能应用于不同大小的N数组的每个元素
- 在编译时拆分字符串在不同的编译器上会得到不同的结果
- 模板参数适用于不同的STL容器
- 重新定义,字符串的不同基本类型
- 制作字符串的不同方法
- C++ 方法基于字符串返回不同的类型
- 如何使此代码适用于不同计算机上的服务器和客户端
- 为字符串生成不同的整体(要使用的点)
- QT5:如何将一个样式表应用于不同的小部件
- 比较两个字符串(但不同类型的)
- 快速获取字符串中不同索引的方法
- 为每个字符串使用不同的索引变量构建字符串到字符串的函数
- C++字符串与C#字符串,不同的运行时间.为什么?