关于std :: hash实现的合理假设

时间:2018-12-13 13:43:44

标签: c++ hash std floating

我们在研究数据库项目中使用了多种形式的哈希。例如,对于基数聚类,我们使用 n 个最低有效位来确定聚类ID。我们使用std::hash进行散列,对我们来说足够了。

但是,尽管我们知道大多数实现都使用身份来哈希整数,但是我们发现在不同的平台上以不同的方式实现了浮点哈希(无论是否有意义,这是另一个讨论)。

关于std::hash,我们可以做出任何合理的假设吗?

MacOS: clang version 6.0.1 (tags/RELEASE_601/final) std::hash<float>{}(1.0f): 0000000000000000000000000000000000111111100000000000000000000000 std::hash<double>{}(1.0): 0011111111110000000000000000000000000000000000000000000000000000

Ubuntu: clang version 6.0.0-1ubuntu2 (tags/RELEASE_600/final) std::hash<float>{}(1.0f): 0101001111100101011001010000100100010100111101010010111101001101 std::hash<double>{}(1.0): 0111010001100001101001000101000001001110110011100111101110011011

1 个答案:

答案 0 :(得分:6)

您可以假设的唯一内容是由标准定义的(请参见cppreference)。

这意味着:

  

特别是,它们定义了一个operator()const:

     
      
  1. 接受Key类型的单个参数。

  2.   
  3. 返回类型为size_t的值,该值表示参数的哈希值。

  4.   
  5. 在被调用时不会引发异常。

  6.   
  7. 对于两个相等的参数k1和k2,std :: hash()(k1)== std :: hash()(k2)。

  8.   
  9. 对于两个不相等的不同参数k1和k2,std :: hash()(k1)== std :: hash()(k2)的概率应为   很小,接近1.0 / std :: numeric_limits :: max()。

  10.   

因此,您可以在不同平台上,具有不同编译器版本的同一平台上甚至从一个运行到另一个运行都具有不同的值。在您的情况下,似乎在一种情况下,您可能正在使用libc ++,而在另一种情况下,您正在使用libstdc ++。