【问题标题】:How many bits of integer data can be stored in a DynamoDB attribute of type Number?Number 类型的 DynamoDB 属性中可以存储多少位整数数据?
【发布时间】:2019-04-03 00:49:38
【问题描述】:

DynamoDB 的 Number 类型支持 38 位小数精度。这不足以存储需要 39 位数字的 128 位整数。最大值为 340,282,366,920,938,463,463,374,607,431,768,211,455 对于无符号的 128 位整数或 170,141,183,460,469,231,731,687,303,715,884,105,727 对于有符号的 128 位整数。这些都是 39 位数字。

如果我不能存储 128 位,那么我在 Number 中存储多少位整数数据可以

【问题讨论】:

    标签: amazon-dynamodb aws-sdk aws-sdk-js aws-sdk-nodejs


    【解决方案1】:

    Number 类型的 DynamoDB 属性可以存储 126 位整数(或 127 位无符号整数,有严重警告)。

    据亚马逊documentation

    数字的精度最高可达 38 位。超过这个会导致异常。

    这意味着(通过在 AWS 控制台中测试验证)DynamoDB 可以存储在 Number 属性中的最大正整数和最小负整数分别是:

    99,999,999,999,999,999,999,999,999,999,999,999,999(又名 10^38-1) -99,999,999,999,999,999,999,999,999,999,999,999,999(又名-10^38+1)

    这些数字需要 126 位的存储空间,使用以下公式:

    bits = floor (ln(number) / ln (2))
         = floor (87.498 / 0.693)
         = floor (126.259)
         = 126
    

    因此,您可以在 DynamoDB 中安全地存储 126 位带符号整数。

    如果你想危险地生活,你也可以存储一个 127 位的 unsigned int,但有一些警告:

    • 您需要避免(或至少要非常小心)使用这样的数字作为排序键,因为最高有效位为 1 的值将排序为负数。
    • 在 DynamoDB 中存储或查询无符号整数时,您的应用需要将它们转换为有符号整数,并且在从 DynamoDB 读取数据后还需要将它们转换回无符号整数。

    如果是我,如果没有非常非常好的理由,我不会再冒这些风险。

    一个合乎逻辑的问题是 126(或考虑到上述警告的 127)是否足以存储 UUID。答案是:视情况而定。如果您可以控制 UUID 的生成,那么您始终可以从 UUID 中删除一两个并存储它。如果您从 4 个“版本”位中剔除(请参阅格式 here),那么如果您始终生成具有相同版本的 UUID,那么您可能根本不会丢失任何熵。

    但是,如果其他人正在生成这些 UUID 并且期望无损存储,那么您可能无法使用 Number 来存储 UUID。但是,如果您将客户端限制在 4-8 UUID versions 的白名单中,则可以存储它。现在最大的版本是 0-15 范围内的 5 个,出于隐私原因,不鼓励使用一些旧版本,因此此限制可能是合理的,具体取决于您的客户以及他们是否遵守RFC 4122 中定义的版本位.

    顺便说一句,我很惊讶这个位限制问题还没有出现在网上……至少不是在一个容易被谷歌搜索到的地方。所以贡献这个问答对,以便未来的搜索者可以找到它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-21
      • 2018-12-24
      • 1970-01-01
      • 2019-11-24
      • 1970-01-01
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多