64位整数到双重碰撞

时间:2018-03-30 14:40:05

标签: c++ c double

我正在GitHub上查看JSON验证库,该库使用double进行所有数字比较(即,在与模式进行比较之前,它将数字从json中拉出double,也被视为double)。

double具有有限数量的状态,就像uint64_t这意味着"碰撞"必须存在 - 即两个不同的uint64_t映射到完全相同的双精度。

我的问题是:如何找到映射到同一个double的两个离散整数,以便我可以向GitHub贡献者证明将64位整数转换为加倍是不安全的?

或者我错了,使用double是完全安全的吗?

1 个答案:

答案 0 :(得分:3)

正如@ user202729指出的那样,只要两个整数共享相同的小数位,就会导致双重碰撞:

碰撞示例:

#include <iostream>

using namespace std;

int main() {
  uint64_t x = 99999999999999997;
  uint64_t y = 99999999999999999;
  double a = x;
  double b = y;
  cout << to_string(x == y) << " " << to_string(a == b) << endl;
}

输出:0 1