DynamoDB的Number
类型支持38位十进制精度。这不足以存储需要39位数字的128位整数。对于无符号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。这些都是39位数字。
如果我不能存储128位,那么我可以在Number
中存储多少位整数数据 ?
答案 0 :(得分:1)
类型为Number
的DynamoDB属性可以存储126位整数(或127位无符号整数,但有一些警告)。
根据Amazon的documentation:
数字的精度最高为38位。超出此范围将导致异常。
(通过AWS控制台中的测试验证)这意味着DynamoDB可以存储在Number
属性中的最大正整数和最小负整数分别是:
99,999,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,999(aka -10 ^ 38 + 1)
这些数字需要使用以下公式存储126位:
bits = floor (ln(number) / ln (2))
= floor (87.498 / 0.693)
= floor (126.259)
= 126
因此,您可以安全地在DynamoDB中存储126位带符号的int。
如果您想过着危险的生活,也可以存储一个127位的 unsigned int,但是有一些警告:
如果是我,没有非常非常好的理由,我就不会再冒这些风险。
一个逻辑问题是126(在上面的警告中为127)是否足以存储UUID。答案是:这取决于。如果您控制着UUID的生成,那么您始终可以从UUID中剃掉一两个字并进行存储。如果您从4个“版本”位中刮除(请参阅格式here),则如果始终生成具有相同版本的UUID,则可能根本不会丢失任何熵。
但是,如果其他人正在生成这些UUID并期望无损存储,则您可能无法使用Number
来存储UUID。但是,如果将客户端限制为4-8 UUID versions的白名单,则可以存储它。目前最大的版本是0-15范围内的5,并且出于隐私原因不建议使用某些较旧的版本,因此此限制可能是合理的,具体取决于您的客户端以及它们是否遵循{{3 }}。
顺便说一句,令我惊讶的是,这个位限制问题还没有在线……至少在一个易于使用Google的地方。因此,贡献这对问答对,以便将来的搜索者可以找到它。