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

How many bits of integer data can be stored in a DynamoDB attribute of type Number?

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

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

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

根据亚马逊的 documentation

Numbers can have up to 38 digits precision. Exceeding this results in an exception.

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

99,999,999,999,999,999,999,999,999,999,999,999,999 (aka 10^38-1) -99,999,999,999,999,999,999,999,999,999,999,999,999 (aka -10^38+1)

这些数字需要 126 位存储,使用这个公式:

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

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

如果你想过得危险,你也可以存储一个 127 位的 unsigned int,但有一些注意事项:

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

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

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

但是,如果其他人正在生成这些 UUID 并且期望无损存储,那么您可能无法使用 Number 来存储 UUID。但是如果您将客户端限制在 4-8 UUID versions. The largest version now is 5 out of a 0-15 range, and some of the older versions are discouraged for privacy reasons, so this limitation may be reasonable depending on your clients and whether they adhere to the version bits as defined in RFC 4122.

的白名单中,您也许可以存储它

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