Comment créer unique entier aléatoire ID de clé primaire pour la table?
Je me demandais si quelqu'un connaissait un bon moyen pour créer un unique entier aléatoire id de clé primaire d'une table. Je suis de l'utilisation de MySQL. La valeur doit être un entier.
pourquoi ne pas simplement
Parce que je veux utiliser cette valeur à Coder à Base62 et ensuite l'utiliser pour un id dans l'url. Si je incrément automatique, il peut être évident pour l'utilisateur comment l'url id est généré.
Pour se déplacer à votre question de sécurité, vous pouvez utiliser AUTO_INCREMENT et comprennent un créé aléatoirement nombre comme un champ. Pour obtenir votre nom d'utilisateur, vous prenez l'AUTO id + nombre aléatoire. Passer à travers une table de hachage (SHA128 fonctionnent très bien). Même si le nombre aléatoire est la même (qui, de façon réaliste, il n'y aura pas, en la combinant avec un autre numéro, puis SHA require il vous donnera votre nom d'utilisateur.
AUTO_INCREMENT
?Parce que je veux utiliser cette valeur à Coder à Base62 et ensuite l'utiliser pour un id dans l'url. Si je incrément automatique, il peut être évident pour l'utilisateur comment l'url id est généré.
Pour se déplacer à votre question de sécurité, vous pouvez utiliser AUTO_INCREMENT et comprennent un créé aléatoirement nombre comme un champ. Pour obtenir votre nom d'utilisateur, vous prenez l'AUTO id + nombre aléatoire. Passer à travers une table de hachage (SHA128 fonctionnent très bien). Même si le nombre aléatoire est la même (qui, de façon réaliste, il n'y aura pas, en la combinant avec un autre numéro, puis SHA require il vous donnera votre nom d'utilisateur.
OriginalL'auteur MindGame | 2010-11-19
Vous devez vous connecter pour publier un commentaire.
Si vous êtes ouvert à toutes les suggestions et vous pouvez la mettre en œuvre, utiliser les Uuid.
MySQL
UUID()
fonction retournera un 36 caractères de la valeur qui peut être utilisé pourID
.Si vous souhaitez utiliser entier, encore, je pense que vous devez créer une fonction
getRandID()
que vous allez utiliser dans laINSERT
déclaration. Cette fonction doit utiliser aléatoire + vérification de l'existant id pour retourner un qui n'est pas utilisé avant.Vérifier
RAND()
fonction de MySQL.C'est la beauté de l'UUID (Universal unique identifier). Citant Wikipédia: "L'intention de l'Uuid est de permettre aux systèmes distribués à identifier de manière unique l'information, sans coordination centrale. Ainsi, n'importe qui peut créer un UUID et l'utiliser pour identifier quelque chose avec une certitude raisonnable que l'identifiant ne sera jamais involontairement utilisé par n'importe qui pour n'importe quoi d'autre. Les informations marquées avec des Uuid peut donc être plus tard combinés dans une seule base de données sans avoir à résoudre les conflits de nom."
Je voudrais juste répéter la fonction dans l'ATTRAPER lorsqu'une exception se pose en raison de la contrainte d'unicité et de continuer jusqu'à ce que vous êtes en mesure d'insérer une ligne avec Id aléatoire.
OriginalL'auteur byte_slave
En réponse à: "Parce que je veux utiliser cette valeur à Coder à Base62 et ensuite l'utiliser pour un id dans l'url. Si je incrément automatique, il peut être évident pour l'utilisateur comment l'url id est généré."
Si la sécurité est votre objectif, puis en utilisant Base62, même avec un "hasard" a généré nombre ne va pas aider.
Une meilleure option serait:
AUTO_INCREMENT
OriginalL'auteur Gary Green
Comment vous générer l'unique_ids est une question utile - mais vous semblez être de faire une contre-productif hypothèse sur quand vous générer de!
Mon point est que vous n'avez pas besoin de générer ces id unique au moment de la création de vos lignes, parce qu'ils sont essentiellement indépendantes des données insérées.
Ce que je fais est pré-générer des id unique pour une utilisation future, de cette façon, je peux prendre mon propre temps doux et absolument garantir qu'ils sont uniques, et il n'y a pas de traitement à faire au moment de l'insertion.
Par exemple j'ai une table commandes avec order_id. Ce code est généré à la volée lorsque l'utilisateur entre dans l'ordre, petit à petit 1,2,3 etc toujours. L'utilisateur n'a pas besoin de voir cette id interne.
Puis j'ai une autre table - unique_ids avec (order_id, unique_id). J'ai une routine qui s'exécute chaque nuit d'une pré-charge cette table avec assez de unique_id lignes à plus de couvrir les ordres qui pourraient être insérés dans les prochaines 24 heures. (Si jamais j'ai la chance de 10000 commandes dans un jour je vais avoir un problème - mais que serait un bon problème à avoir!)
Cette approche garantit l'unicité et prend toute la charge de traitement à l'écart de la transaction d'insertion et dans le lot de routine, où il n'a pas d'incidence sur l'utilisateur.
OriginalL'auteur Rob Beer
Comment sur cette approche (
PHP
etMySQL
):Court
number
pouruser_id (UNIQUE)
number
commeuser_id
Semble lourd? Continuer à lire.
Long:
Table:
Code:
$min
,$max
,0.5
) sont juste pour l'explication et ils n'ont pas de signification statistique.insert_to_table
etreport_this_fact
sont pas générer en PHP. Le sont aussi comme des chiffres juste pour préciser les besoins de l'explication.OriginalL'auteur TheFrost
à ma façon, à la fois 32 bits et 64 bits plate-forme. le résultat est 64bit
OriginalL'auteur lbsweek
Vous pouvez utiliser un
AUTO_INCREMENT
pour votre table, mais donner aux utilisateurs de la version chiffrée:encrypted_id:
SELECT HEX(AES_ENCRYPT(id, 'my-private-key'));
id:
SELECT AES_DECRYPT(UNHEX(encrypted_id), 'my-private-key');
OriginalL'auteur Const Mi
AUTO_INCREMENT
est va être votre meilleur pari pour ce.Ici en sont quelques exemples.
Si vous en avez besoin vous pouvez régler la valeur de l'incrément commence (par défaut c'est 1).
OriginalL'auteur Webnet
Il y a un
AUTO_INCREMENT
fonctionnalité. Je voudrais l'utiliser.Voir ici plus d'exemples.
OriginalL'auteur drew