Документация Amazon DynamoDB, как представляется, намеренно связана с тем, как раздел выбирается для строки. Вот discussion о Partition Key (курсив мой):Что такое «внутренняя хэш-функция» для UUID в DynamoDB?
Partition ключ - простой первичный ключ, состоящий из одного атрибута, известного как раздела ключа.
DynamoDB использует значение ключа раздела в качестве входного сигнала для внутренней хэш-функции. Выход из хэш-функции определяет раздел (физическое хранилище, внутреннее для DynamoDB), в котором элемент будет сохранен.
В таблице, содержащей только клавишу раздела, никакие два элемента не могут иметь одинаковое значение ключа раздела.
Таблица
People
, приведенная в Tables, Items, and Attributes, является примером таблицы с простым первичным ключом (PersonID
). Вы можете сразу получить доступ к любому элементу в таблицеPeople
, указав значениеPersonId
для этого элемента.
Таким образом, приведенный пример имеет PersonID как число, которое может быть грандиозным или унылым для хэширования - в зависимости от этой внутренней хэш-функции.
В моем проекте мы используем случайный UUID v4 для нашего первичного ключа, и в настоящее время мы сохраняем этот UUID в форме String/S
(с включенными тире). Мне приходит в голову, что, подобно целому числу, эта строка UUID может хеш красиво или мрачно в зависимости от этой внутренней хэш-функции.
Сохраняющиеся UUID как строки удобны для нас (хотя и расточительно пространственные), потому что мы можем просматривать/запрашивать UUID в консоли Dynamo в том же формате v4, что и в журналах нашего приложения. НО, если сохранится наша UUIDs в форме String/S
, а не в форме Binary/B
, это приведет к ужасному наложению наших строк на один или два раздела, потому что внутренняя хеш-функция наивна для преобразования нашей строки UUID в байты, тогда удобство быть проклятым, а бинарная/B
форма лучше всего подходит для UUID.
Итак, я хотел бы узнать больше о внутренней хеш-функции (желательно от самих разработчиков Динамо). Молитесь, дайте нам подробности относительно уровня умений в этой внутренней хэш-функции. Как он ведет себя со строкой/S
, Number/N
и двоичными/B
типами?
Означает ли внутренняя функция хеш-кода, что мы передаем строку форматированного UUID v4 и автоматически хэш в двоичной форме этого UUID? Или это лексикографическое хеширование?
Если ключевой алгоритм хеширования String/S
по умолчанию наивен, есть ли какой-либо программный способ, который я могу использовать, чтобы намекнуть на Dynamo, что мой String-ключ является UUID и имеет ли он хэш в двоичной форме как таковой? Я использую DynamoSDK для Java с DynamoDBMapper для доступа к моим таблицам, и я могу посыпать дополнительные аннотации на мои сущности везде, где вы направляете. Я также контролирую собственное определение таблицы с помощью конфигураций схемы DynamoDB json и могу там вносить изменения там, где это необходимо.
Спасибо, это дает мне подсказки. Ясно, что внутренняя хеш-функция Number не наивна, поэтому строка может быть не такой. Как вы сказали, делать предположения были бы опасны, потому что они преднамеренно оставили вещи неуказанными. Тем не менее, есть что-то захватывающее в плане опасной жизни! Мне было бы приятно, что в феврале 2017 года AWS делает некоторое умное хэширование со строками (особенно довольно случайными шестнадцатеричными), и мне не нужно беспокоиться о сглаживании моих ключей к определенным разделам. – DWoldrich
Да, как я уже сказал, вам не нужно явно указывать свои ключи на определенные разделы. –