C++ std::hash在stdlib发行版中是否保证相同
如果我使用C++ std::hash在stdlib发行版中是否保证相同,c++,c++11,hash,stdhash,C++,C++11,Hash,Stdhash,如果我使用libstdc++进行了std::hash,然后在即将推出的C++11VS 2012库中进行了一次,那么它们会匹配吗 我假设散列实现不是C++规范的一部分,可以根据分布而变化?不,这是不保证的。代码>标准::哈希只需遵守以下条件: 接受Key类型的单个参数 返回类型为size_t的值,该值表示参数的哈希值 调用时不抛出异常 对于两个相等的参数k1和k2,std::hash()(k1)==std::hash()(k2) 对于不相等的两个不同参数k1和k2,std::hash()(k1)=
libstdc++
进行了std::hash
,然后在即将推出的C++11
VS 2012库中进行了一次,那么它们会匹配吗
我假设散列实现不是C++规范的一部分,可以根据分布而变化?
不,这是不保证的。代码>标准::哈希只需遵守以下条件:
该标准仅规定: 20.8.12类模板散列23.5中定义的无序关联容器使用类模板散列的专门化作为 默认哈希函数。对于存在的所有对象类型键 作为专门化散列,安装散列应:
- 满足哈希要求(17.6.3.4),键作为函数调用参数类型,默认可构造要求(表19), 可分配副本的要求(表23)
- 可交换左值(17.6.3.2)
- 提供两种嵌套类型result_type和argument_type,它们分别是size_t和Key的同义词
- 满足以下要求:如果k1==k2为真,则h(k1)==h(k2)也为真,其中h是hash类型的对象,k1和k2为 类型为Key的对象
散列函数返回的值的要求(17.6.3.4散列要求[Hash.requirements]):
表26-哈希要求[哈希]
返回的值应仅取决于参数k
。
[注:因此表达式h(k)
的所有计算
k的相同值
产生相同的结果。-结束注][注:
对于两个不同的值t1
和t2
,以下概率
h(t1)
和h(t2)
比较相等应非常小,接近1.0/数值限制::max()
-结束注释]
实际上,对于整型std::hash(k)
相当于k
,这是非常常见的,因为这是符合标准的最简单的实现。对于其他类型,任何事情都是可能的。我认为该值未指定,但在一次执行中保持一致。这不太可能是一个问题,因为使用std::hash
的容器也很可能是在仅标头的库中提供的,所以您仍然可以获得整个包。不,标准没有指定函数的值,只指定函数的特征。@MattClarkson-最早的答案、格式最好的答案或带引号的最佳文本是明智的选择。但这完全取决于你。它们可以(但通常不会)因跑步而变化,如果通过,它们将被要求改变。不管是否使用,std::hash都不适合用于指纹识别。虽然cppreference是一个很好的站点(我自己一直在使用它),但它并不等同于标准。