Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::hash在stdlib发行版中是否保证相同_C++_C++11_Hash_Stdhash - Fatal编程技术网

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++规范的一部分,可以根据分布而变化?

不,这是不保证的。代码>标准::哈希只需遵守以下条件:

  • 接受Key类型的单个参数
  • 返回类型为size_t的值,该值表示参数的哈希值
  • 调用时不抛出异常
  • 对于两个相等的参数k1和k2,std::hash()(k1)==std::hash()(k2)
  • 对于不相等的两个不同参数k1和k2,std::hash()(k1)==std::hash()(k2)应 非常小,接近1.0/std::numeric_limits::max()

  • 该标准仅规定:

    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中,这是最重要的(表26):

    不应抛出异常。返回的值应仅取决于 论点k。[注:因此,表达式h(k)的所有计算 k值相同时,结果也相同。-结束注][注: 对于两个不同的值t1和t2,h(t1)和 h(t2)比较相等值应非常小,接近1.0/数字_- 限制::max().-结束注释]

    因此,一般来说,不,计算本身没有定义,结果也不需要在实现过程中保持一致。因此,即使是同一个库的两个不同版本也可能给出不同的结果。

    散列函数返回的值的要求(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是一个很好的站点(我自己一直在使用它),但它并不等同于标准。