Сколько битов целочисленных данных можно сохранить в атрибуте DynamoDB типа Number? - PullRequest
0 голосов
/ 30 октября 2018

Тип DynamoDB Number поддерживает 38 цифр десятичной точности. Это недостаточно для хранения 128-разрядного целого числа, для которого потребуется 39 цифр. Максимальное значение составляет 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 000 для подписанных 128-разрядных. Это оба 39-значных номера.

Если я не могу сохранить 128 бит, то сколько бит целочисленных данных можно сохранить в Number?

1 Ответ

0 голосов
/ 30 октября 2018

Атрибут DynamoDB типа Number может хранить 126-разрядные целые числа (или 127-разрядные целые числа без знака с серьезными оговорками).

Согласно документации Amazon :

Числа могут иметь точность до 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

Таким образом, вы можете безопасно хранить 126-битное целое число со знаком в DynamoDB.

Если вы хотите жить опасно, вы можете также хранить 127-битный unsigned int, но есть некоторые предостережения:

  • Вам следует избегать (или, по крайней мере, быть очень осторожным) использования такого числа в качестве ключа сортировки, поскольку значения со старшим значащим битом 1 будут сортироваться как отрицательные числа.
  • Вашему приложению потребуется преобразовать неподписанные целые числа в подписанные, сохраняя их или запрашивая их в DynamoDB, а также необходимо преобразовывать их обратно в неподписанные после чтения данных из DynamoDB.

Если бы это был я, я бы не стал рисковать ни на один лишний бит без очень, очень веской причины.

Один логический вопрос заключается в том, достаточно ли 126 (или 127 с учетом приведенных выше предостережений) для хранения UUID. Ответ: это зависит. Если вы контролируете генерацию UUID, то вы всегда можете сбрить немного или два из UUID и сохранить его. Если вы бреетесь из 4 битов версии (см. Формат здесь ), то, возможно, вы вообще не потеряете энтропию, если всегда генерируете UUID с одной и той же версией.

Однако, если кто-то еще генерирует эти UUID и ожидает хранилища без потерь, вы, возможно, не сможете использовать Number для хранения UUID. Но вы можете сохранить его, если вы ограничите клиентов белым списком 4-8 UUID . Самая большая версия в настоящее время составляет 5 из диапазона 0-15, а некоторые более старые версии не рекомендуется по соображениям конфиденциальности, поэтому это ограничение может быть разумным в зависимости от ваших клиентов и от того, придерживаются ли они биты версии, как определено в RFC 4122 .

Кстати, я был удивлен, что этот вопрос с ограничением по битам еще не был онлайн ... по крайней мере, не в легко доступном для Google месте. Так что добавив эту пару вопросов и ответов, чтобы будущие поисковики могли ее найти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...