Bou*_*ner 2 c++ hash std floating
我们在研究数据库项目中使用了几种形式的散列.例如,对于基数聚类,我们使用n个最低有效位来确定聚类ID.我们std::hash用于散列,这对我们来说已经足够了.
然而,虽然我们知道大多数实现都使用了哈希整数的标识,但我们偶然发现浮动哈希(无论这是否有意义是另一种讨论)在不同平台上的不同实现.
我们可以做出任何公平的假设std::hash吗?
苹果系统:
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
您可以假设的唯一事项由标准定义(请参阅cppreference).
这意味着:
特别是,它们定义了一个operator()const:
接受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 ().
因此,您可以在不同平台上,在具有不同编译器版本的同一平台上,甚至从一个运行到另一个运行中具有不同的值.在您的情况下,似乎在一种情况下,您可能正在使用libc ++,而在另一种情况下,您可能正在使用libstdc ++.