查找通过双精度数据类型舍入 C# 更改的原始数字(Facebook 用户 ID)

本文关键字:数字 原始 Facebook 用户 ID 双精度 数据类型 舍入 查找 | 更新日期: 2023-09-27 18:33:13

我开发了一个应用程序,其中用户的Facebook名称和用户ID被保存为身份验证系统。

我将 ID 保存为 C# 脚本中的双精度值。但事实证明,较新的Facebook用户的ID超过15位,这是没有四舍五入的双数据类型的限制(我在开发过程中不知道,哎哟!因此,数字四舍五入,值发生了巨大变化。有趣的是,四舍五入的数字是 16 位数字,它们不是登录用户的真实用户 ID。

在意识到此错误后,我更改了代码,但是无法找出之前已经登录的用户。

想知道我是否可以从我现在拥有的 16 位四舍五入双精度数中找到原始号码?我全都听见了。

查找通过双精度数据类型舍入 C# 更改的原始数字(Facebook 用户 ID)

正如在对该问题的评论中已经指出的那样,无法从双精度恢复原始输入,最好将其视为字符串。

问题是,对于 9,007,199,254,740,992 及更大,两个或多个整数映射到相同的双精度。双精度的确切值就是其中之一。

但是,这并不意味着您的应用程序会丢失所有内容。对于 16 位和 17 位整数,只有几个整数映射到每个双精度。两个帐户具有相同的名称和映射到同一双精度的不同ID的可能性很低。将双精度视为原始 ID 的单向哈希。每次需要进行身份验证并且存储的双精度至少为 9,007,199,254,740,992 时,都需要获取 ID,将其转换为双精度,如果匹配,则接受。还应将 ID 存储为字符串,以供将来检查。

给定一个双精度值,可以找到在

转换时映射到该双精度的多头范围(如果有的话(。如果需要超出长范围,请改用一些扩展整数类型。不幸的是,我没有足够的 C# 来用这种语言编写它。下面是一个 Java 版本:

  /*
   * Return range of longs that all map to d on conversion, null
   * if there is no such long.
   */
  private static long[] getLongRange(double d) {
    long[] result = new long[2];
    long center = (long)d;
    if(center != d){
      return null;
    }
    for(long lower = center; (double)lower == d; lower--){
      result[0] = lower;
    }
    for(long upper = center; (double)upper == d; upper++){
      result[1] = upper;
    }
    return result;
  }