Maison >base de données >tutoriel mysql >Comment générer des identifiants entiers uniques pour les modèles Django sans unicité globale ?

Comment générer des identifiants entiers uniques pour les modèles Django sans unicité globale ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-01 04:50:13292parcourir

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

Comment remplacer la clé primaire par un entier unique pour une table spécifique dans Django

Dans les applications Django, la clé primaire par défaut est une clé automatique -entier incrémenté, qui peut être visible par les utilisateurs externes via des URL. Pour protéger ces informations, une pratique courante consiste à hacher la clé primaire. Cependant, cette méthode peut nécessiter des hachages et des déhachages fréquents, ce qui peut s'avérer inefficace.

Solution

Une meilleure approche consiste à générer un entier unique qui n'est pas unique au niveau mondial mais uniquement unique dans une table spécifique. Ceci peut être réalisé en utilisant une combinaison d'un horodatage et d'un composant aléatoire :

Code Python pour générer des identifiants

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 Modèle

from django.db import models

class MyClass(models.Model):
    id = models.BigIntegerField(default=make_id, primary_key=True)

Avantages

  • Unique dans un tableau, réduisant l'exposition des informations sensibles.
  • Génère des identifiants courts, minimiser la longueur de l'URL.
  • Évite la surcharge de hachage lors de la lecture/écriture opérations.

Notes supplémentaires

  • START_TIME marque le début de la plage d'horodatage pour éviter les conflits.
  • reverse_id permet de faciliter conversion de l'ID en horodatage, facilitant le suivi des heures de création si nécessaire.
  • Cette approche est similaire à la Génération d'identifiants utilisée par Instagram, offrant une solution évolutive et efficace.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn