Как бэкэнд-инженерам, нам часто приходится создавать системы, которые могут масштабировать и обрабатывать многочисленные ресурсы, пользователей и объекты, каждый из которых нуждается в уникальной идентификации. Во многих случаях использование последовательных идентификаторов (например, 1, 2, 3) кажется простым решением, но это может быстро стать проблематичным по мере роста и масштабирования вашего приложения в распределенных системах. Здесь на помощь приходят UUID (универсальные уникальные идентификаторы).
В этой записи блога мы рассмотрим:
UUID (универсальный уникальный идентификатор) — это 128-битное число, используемое для уникальной идентификации информации в компьютерных системах. Он спроектирован так, чтобы быть глобально уникальным, а это означает, что UUID, созданные независимо в разных системах, не будут конфликтовать.
UUID выглядит следующим образом:
66e69275-c6bc-800c-90a6-2f41cb991502
Он состоит из 32 шестнадцатеричных цифр, отображаемых пятью группами, разделенными дефисами, в виде 8-4-4-4-12.
Ключи базы данных в распределенных системах: в системах, где разные базы данных или микросервисы должны генерировать уникальные идентификаторы без взаимодействия друг с другом, UUID обеспечивают уникальность. Например, в распределенной платформе электронной коммерции каждая служба может независимо генерировать идентификаторы заказов или транзакций, а UUID позволит избежать конфликтов.
Идентификаторы сеансов: UUID обычно используются для идентификации пользовательских сеансов в веб-приложениях. Они особенно полезны, когда вам нужно сохранить информацию о сеансе без утечки конфиденциальных или предсказуемых данных.
Идентификаторы файлов или ресурсов: когда вам нужно отслеживать файлы, документы или любой ресурс на различных платформах или базах данных, каждому ресурсу можно назначить UUID для облегчения поиска без риска дубликаты.
API и внешние ссылки: раскрытие последовательных или легко угадываемых идентификаторов (например, user/1, user/2) в API может привести к уязвимостям конфиденциальности. Используя UUID (например, user/66e69275-c6bc-800c-90a6-2f41cb991502), вы снижаете вероятность того, что пользователи угадают и получат доступ к ресурсам, которые им не принадлежат.
Библиотека uuid Python упрощает создание UUID и управление ими. Вот как:
import uuid # Generate a UUID generated_uuid = uuid.uuid4() print(f"Generated UUID: {generated_uuid}")
Функция uuid4() генерирует случайный UUID на основе случайных или псевдослучайных чисел, что является наиболее распространенным вариантом, используемым в веб-разработке.
При использовании таких баз данных, как PostgreSQL, в качестве первичных ключей обычно используются UUID. Вот как это можно настроить на Python с помощью SQLAlchemy:
from sqlalchemy import Column, String from sqlalchemy.dialects.postgresql import UUID import uuid from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class User(Base): __tablename__ = 'users' id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, unique=True, nullable=False) username = Column(String, nullable=False) # This will generate a UUID primary key for each new user.
В этом примере мы определяем поле id как UUID, гарантируя, что каждый пользователь будет иметь уникальный идентификатор, который не будет конфликтовать с другими записями, даже в распределенных базах данных.
Игнорирование UUID в пользу последовательных или автоматически увеличивающихся идентификаторов может представлять собой несколько рисков:
Уязвимости безопасности: Последовательные идентификаторы предсказуемы, что позволяет злоумышленникам легко перебирать записи и обнаруживать конфиденциальные данные. Например, если идентификаторы пользователей являются последовательными, злоумышленник может попытаться угадать идентификаторы других пользователей и получить доступ к неавторизованным учетным записям.
Конфликты данных: В распределенной системе использование автоинкрементных целых чисел может привести к коллизиям идентификаторов, особенно когда несколько служб или баз данных генерируют идентификаторы без центральной координации.
Проблемы миграции и слияния данных: при объединении баз данных или переносе данных между системами наличие неуникальных последовательных идентификаторов может привести к конфликтам. UUID позволяют избежать этих проблем, гарантируя уникальность.
Хранение UUID в виде строк: Распространенной ошибкой является сохранение UUID в виде строк, что приводит к потере места и может замедлить выполнение запросов, особенно в больших базах данных. Большинство современных баз данных, таких как PostgreSQL, имеют собственные типы UUID, которые эффективно хранят UUID.
Неправильный:
CREATE TABLE users ( id VARCHAR(36) PRIMARY KEY );
Верно:
CREATE TABLE users ( id UUID PRIMARY KEY );
Не используется правильная версия UUID: существует несколько версий UUID (например, uuid1(), uuid3(), uuid4(), uuid5()), каждая из которых подходит для конкретного использования. случаи. uuid4(), основанный на случайных числах, чаще всего используется для генерации уникальных идентификаторов в веб-приложениях. Помните, какую версию вы используете и соответствует ли она вашим потребностям.
Игнорирование возможности коллизии: хотя UUID спроектированы так, чтобы быть уникальными, вероятность коллизии очень мала. Для большинства приложений риск незначителен, но если вы генерируете миллиарды UUID или работаете в высокочувствительных средах, вам следует реализовать обнаружение коллизий.
Используйте UUID для внешних ссылок: при представлении идентификаторов в URL-адресах или API отдавайте предпочтение UUID последовательным идентификаторам. Это повышает безопасность и затрудняет пользователям прогнозирование идентификаторов ресурсов.
Сохранение UUID в собственных форматах: используйте собственный тип UUID базы данных для хранения UUID вместо строк. Это уменьшает объем памяти и повышает производительность запросов.
Выберите правильную версию UUID: в большинстве случаев uuid4() (случайный UUID) является лучшим выбором для генерации уникальных идентификаторов в веб-приложениях. Однако, если вам нужны детерминированные UUID, вы можете рассмотреть uuid3() или uuid5() (UUID на основе пространства имен).
Проверка UUID: при принятии UUID из пользовательского ввода всегда проверяйте их, чтобы убедиться, что они правильно отформатированы перед обработкой. В Python вы можете использовать объекты UUID для проверки правильности строки.
def is_valid_uuid(uuid_to_test, version=4): try: uuid_obj = uuid.UUID(uuid_to_test, version=version) return str(uuid_obj) == uuid_to_test except ValueError: return False # Example usage print(is_valid_uuid("66e69275-c6bc-800c-90a6-2f41cb991502")) # True print(is_valid_uuid("invalid-uuid-string")) # False
UUID — это мощные инструменты для генерации уникальных идентификаторов в распределенных системах и обеспечения безопасности веб-приложений. Они помогают избежать таких проблем, как конфликты данных, предсказуемые атаки идентификаторов и конфликты идентификаторов во время миграции базы данных. Понимая и следуя лучшим практикам использования UUID, вы можете создавать более надежные, масштабируемые и безопасные серверные системы.
Не забудьте использовать соответствующую версию UUID, правильно хранить их в своих базах данных и помнить о потенциальных рисках. Благодаря этим советам вы будете хорошо подготовлены к эффективной работе с UUID в своих проектах!
Не стесняйтесь оставлять комментарии ниже, если у вас есть какие-либо вопросы или дополнительные советы по UUID! Приятного кодирования!
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3