ホームページ > データベース > mysql チュートリアル > グローバルな一意性を持たずに Django モデルの一意の整数 ID を生成するにはどうすればよいですか?

グローバルな一意性を持たずに Django モデルの一意の整数 ID を生成するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-01 04:50:13
オリジナル
223 人が閲覧しました

How to Generate Unique Integer IDs for Django Models Without Global Uniqueness?

Django の特定のテーブルの主キーを一意の整数に置き換える方法

Django アプリケーションでは、デフォルトの主キーは auto です。 -増分整数。URL を通じて外部ユーザーに表示される場合があります。この情報を保護するには、主キーをハッシュするのが一般的です。ただし、この方法では頻繁にハッシュとハッシュ解除が必要になる可能性があり、非効率的になる可能性があります。

解決策

より良いアプローチは、グローバルに一意ではない一意の整数を生成することです。特定のテーブル内でのみ一意です。これは、タイムスタンプとランダム コンポーネントの組み合わせを使用して実現できます。

ID を生成するための Python コード

import time
import random

START_TIME = time.time() * 1000  # Initial timestamp (arbitrary)

def make_id():
    """
    Generates a unique ID based on a timestamp and random bits.
    """
    t = int(time.time() * 1000) - START_TIME
    u = random.SystemRandom().getrandbits(23)
    id = (t << 23) | u
    return id

def reverse_id(id):
    """
    Converts ID back to a timestamp.
    """
    t = id >> 23
    return t + START_TIME
ログイン後にコピー

Djangoモデル

from django.db import models

class MyClass(models.Model):
    id = models.BigIntegerField(default=make_id, primary_key=True)
ログイン後にコピー

利点

  • テーブル内で一意であり、機密情報の公開を軽減します。
  • 短い ID を生成します。 URL の長さを最小限に抑えます。
  • 実行中のハッシュ オーバーヘッドを回避します。読み取り/書き込み操作。

追加メモ

  • START_TIME は、競合を防ぐためにタイムスタンプ範囲の開始を示します。
  • reverse_id ID からタイムスタンプに簡単に変換できるため、作成時間の追跡が容易になります。
  • このアプローチは Instagram で使用される ID 生成に似ており、スケーラブルで効率的なソリューションを提供します。

以上がグローバルな一意性を持たずに Django モデルの一意の整数 ID を生成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート