我正在GitHub上查看JSON验证库,该库使用double
进行所有数字比较(即,在与模式进行比较之前,它将数字从json中拉出double
,也被视为double
)。
double
具有有限数量的状态,就像uint64_t
这意味着"碰撞"必须存在 - 即两个不同的uint64_t
映射到完全相同的双精度。
我的问题是:如何找到映射到同一个double的两个离散整数,以便我可以向GitHub贡献者证明将64位整数转换为加倍是不安全的?
或者我错了,使用double是完全安全的吗?
答案 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