Skip to main content

Pretty cool IDs for your APIs

Project description

PrettyId

Pretty cool IDs for your APIs.

poetry add prettyid

Synopsis

Generate prefixed IDs, like Stripe does:

>>> from pretty_id import PrettyId
>>> pid = PrettyId.random("task")
PrettyId("task_068n34jrjdth1fqr2nm9a0sh50")
>>> pid.type, pid.id
('task', '068n34jrjdth1fqr2nm9a0sh50')
>>> pid.bytes
b'...'

Backwards compatible with UUID:

>>> pid = PrettyId.from_uuid("1d4e2ea4-c1ab-4a98-8eeb-898051ef0f71", type="task")
PrettyId("task_3n72x961nd59h3qbh6053vrfe4")
>>> pid.uuid
UUID('1d4e2ea4-c1ab-4a98-8eeb-898051ef0f71')

Works with Pydantic and FastAPI:

@app.route("/tasks/{id}")
def get_task_by_id(id: FriendlyId):
    if id.type != "task":
        raise HTTPException(status_code=400, detail="ID should start with 'task_'")

    return {
        "id": id,
        "title": "TODO",
    }

Design

Generated IDs use UUIDv7 underneath:

>>> u = UUID(bytes=pid.bytes)
UUID('01917192-7b9b-7b10-bf5b-15ec95039128')
>>> u.version
7

This means they inherit some useful properties:

  • Natural Sorting: UUIDv7 values are time-sortable, which means you can sort them in increasing order based on when they were generated. Databases often require additional timestamp columns to sort records based on creation time. With PrettyId, you can achieve this sorting using the ID itself, eliminating the need for extra columns.

  • Optimized Indexing: Since UUIDv7 is time-sortable, database indexing mechanisms can better optimize the storage and retrieval processes, leading to faster query times especially for time-based queries.

  • Concurrency and Distribution: In distributed systems, generating unique, sequential IDs can be a challenge. UUIDv7 can be generated concurrently across multiple nodes without the risk of collisions, making it suitable for distributed architectures.

IDs are encoded as lowercase Base32 using Douglas Crockford’s alphabet. This makes them compact, readable, and case-insensitive.

In database, IDs are stored without prefix using a native UUID type or BINARY(16). (We assume that the prefix can be determined from the table name.)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

prettyid-0.2.0.tar.gz (8.2 kB view details)

Uploaded Source

Built Distribution

prettyid-0.2.0-py3-none-any.whl (8.9 kB view details)

Uploaded Python 3

File details

Details for the file prettyid-0.2.0.tar.gz.

File metadata

  • Download URL: prettyid-0.2.0.tar.gz
  • Upload date:
  • Size: 8.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.3 CPython/3.12.4 Linux/6.9.12-401.asahi.fc40.aarch64+16k

File hashes

Hashes for prettyid-0.2.0.tar.gz
Algorithm Hash digest
SHA256 b3264e8f1e1bc908aedd3ceef4765ab47508fa2c3398005789560218f6ce6004
MD5 13658dcefaa019d3f73856404a5bc888
BLAKE2b-256 065e82bf44905b362bea8085fc184c1f4f64a39203d884fcfe25092df4fef977

See more details on using hashes here.

File details

Details for the file prettyid-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: prettyid-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 8.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.8.3 CPython/3.12.4 Linux/6.9.12-401.asahi.fc40.aarch64+16k

File hashes

Hashes for prettyid-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6c3d51cf69cc4d285b3ba0bfb7d1f4e57dfe25c0ef18064ee213574046e2346d
MD5 110e3c744065146f51cd5c4541febbc6
BLAKE2b-256 9a4216f91bcef841f737d5c15a0a3c236c9090884c02dc6517c58c1fffc006e5

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page