Number 类型的 DynamoDB 属性中可以存储多少位整数数据?

Jus*_*ant 4 amazon-dynamodb aws-sdk aws-sdk-nodejs aws-sdk-js

DynamoDB 的Number类型支持 38 位十进制精度。这不足以存储需要 39 位数字的 128 位整数。最大值为 340,282,366,920,938,463,463,374,607,431,768,211,455 为 unsigned 128 位整数或 170,141,183,460,469,231,731,861,730,861,730,861,730,861,861,861,873 这些都是 39 位数字。

如果我不能存储128位,那么有多少整型数据位我在商店Number

Jus*_*ant 11

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

根据亚马逊的文档

数字的精度最高可达 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,99991(又名 10^38-1)

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

bits = floor (ln(number) / ln (2))
     = floor (87.498 / 0.693)
     = floor (126.259)
     = 126
Run Code Online (Sandbox Code Playgroud)

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

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

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

如果是我,我不会在没有非常非常好的理由的情况下多冒一点风险。

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

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

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