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
Libérer: 2024-12-01 04:50:13
original
225 Les gens l'ont consulté

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
Copier après la connexion

Django Modèle

from django.db import models

class MyClass(models.Model):
    id = models.BigIntegerField(default=make_id, primary_key=True)
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal