Skip to main content

MUID (Magic Unique Identifier)

CI PyPI version Python 3.11+ License

Библиотека для работы с уникальными идентификаторами MUID.

Почему MUID?

  1. Всегда уникален даже в распределённой системе. Позволяет генерировать MUID на клиенте без обращения к серверу.
  2. Монотонен. TS метка и счётчик позволяют оптимально добавлять новые записи в B-Tree.
  3. Подходит для распределённых и высоконагруженных систем. Каждый процесс получает свой отпечаток. Счётчик позволяет генерировать до 8192 уникальных MUID в миллисекунду на каждый процесс.
  4. Мало предсказуем, даже зная ts и proc_fn математически сложно угадать следующий MUID за счёт secure rand. ВАЖНО: размер и стойкость secure rand может меняться в будущих версиях. Для реальной энтропии требуется от 36 битов, я взял 40 бит.

Быстрый старт

Установите пакет

pip install magicid

И создайте первый MUID

from muid import MagicID

muid = MagicID()

print(muid)
# 0001-8EA1C900-0F6F8410-1E7C1CA4

Или через консоль

muid new -n 5
#0002-977F0200-0300034F-EA9CE3FA
#0002-977F0200-050003FC-97B34993
#0002-977F0200-0700034B-FEAB9541
#0002-977F0200-090003A4-D18816C8
#0002-977F0200-0B00034D-FF2FD3F8

Использование в Pydantic

from muid import MagicID
from pydantic import BaseModel, Field


class User(BaseModel):
    id: MagicID = Field(default_factory=MagicID)
    
user = User()
print(user.id)
# 0001-8EA1C900-0F6F8410-1E7C1CA4

json_user = {"id": "0001-8EA1C900-0F6F8410-1E7C1CA4"}

user = User.model_validate(json_user)
print(user.id)
# 0001-8EA1C900-0F6F8410-1E7C1CA4

Сравнение

from datetime import datetime
from muid import MagicID

muid = MagicID()

muid == str(muid)  # True
muid == muid.raw  # True
muid == None  # False
MagicID() > muid  # True
MagicID.from_datetime(datetime(2026, 3, 2)) < muid  # True
muid < str(muid)  # TypeError: упорядочивание только между MagicID

Ключом dict/set служит только сам MagicID: по str(muid) или muid.raw запись не найдётся, используйте MagicID(key).

Принцип работы

MUID состоит из 4 частей: [ts ms 42 bits]-[counter 13 bits]-[proc_fn 17 bits]-[secure rand 40 bits]

Всего 14 байт, в HEX представлении 31 символ, включая дефисы.

При инициализации пакета генерируется proc_fn и используется до следующей инициализации. При переполнении counter ждёт до следующей миллисекунды (ref. Snowflake ID)

Лицензия

Проект инициирован, разработан и поддерживается Aleksandr @magicaleks. Распространяется на основании лицензии Apache-2.0.

Metadata

Release files for magicid 1.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for magicid 1.3.0
File Size Uploaded Provenance Actions
magicid-1.3.0.tar.gz 11.9 kB Without provenance Details for magicid-1.3.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for magicid 1.3.0
File Interpreter ABI Platform Actions
magicid-1.3.0-py3-none-any.whl Python 3 none any Details for magicid-1.3.0-py3-none-any.whl

Total release size: 22.9 kB

Release files / magicid-1.3.0.tar.gz

Download URL magicid-1.3.0.tar.gz
Size 11.9 kB
Tags Source
SHA-256 checksum
How to use checksums
f4d935dfc8ca7a776df612232fcbc3a0cb4af0d8f2d954ac32b0ffc851373eaf
BLAKE2b-256 checksum
How to use checksums
00c17a7e82cff021e0008c1fc829ca05401b6a3e5ca06aaf9df1b3b1ca71a85c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.11.9

Release files / magicid-1.3.0-py3-none-any.whl

Download URL magicid-1.3.0-py3-none-any.whl
Size 11.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
02ec3a24e68a51149dea7b2f7829c7bdaa00b903828ee5c8f6a5cda1c1d4cd40
BLAKE2b-256 checksum
How to use checksums
60490eef90539747a372d1913d6f13d9aa7d8295eae3b0feebf27c4b116131c8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.11.9

Security for magicid 1.3.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page