Générer des 8 chiffres du uinque id en c#
J'ai besoin de générer des 8 chiffres identifiant unique dans c#. Sur mon site un utilisateur enregistre et j'ai besoin de générer un id unique pour lui dans le code c# (je ne veux pas de cette logique en DB), après l'insertion de l'id j'ai besoin de l'enregistrer dans la base de données.
Edit: j'ai besoin que les nombres générés de façon aléatoire à chaque fois.
- Pouvez-vous expliquer pourquoi vous êtes contre cela dans la DB?
Vous devez vous connecter pour publier un commentaire.
Bien que pas 8 chiffres, je voudrais utiliser un GUID à cet effet:
De Wikipedia:
probability of the same number being generated twice is extremely small
mais pas 0Si vous n'avez pas l'esprit de l'Id d'être prévisible, j'irais avec Vlad suggestion.
Sinon, j'ai générer un nombre aléatoire dans la plage requise et juste essayer pour l'insérer dans la base de données... si vous obtenez une exception en raison de la contrainte d'unicité violés dans la base de données (et cette contrainte devrait absolument être là), puis essayez de nouveau. Continuer à essayer jusqu'à ce qu'il fonctionne, ou que vous avez fait le tour d'un certain nombre de fois. (Il est très peu probable que vous allez échouer 100 fois par exemple - sauf si vous avez un bug d'ailleurs, dans ce cas, une exception est préférable à une boucle infinie.)
Donc ce n'est pas générer l'ID dans la base de données - mais c'est la vérification de l'unicité dans la base de données, qui est, après tout, l'ultime source de la vérité".
Si vous n'avez pas besoin du point de vue cryptographique générée de façon sécurisée Id, puis tout simplement en utilisant
Random.Next(100000000)
va générer une valeur dans l'intervalle [0, 99999999]. Si vous ne voulez pas toutes les valeurs qui ont besoin de leaders de 0 pour arriver à 8 chiffres, il suffit d'utiliserRandom.Next(10000000, 100000000)
qui vous donnera une petite plage de valeurs possibles, mais vous n'aurez pas besoin de vous soucier d'eux ayant moins de 8 chiffres.À l'aide de
Random
correctement a quelques "erreurs" - voir mon article sur le sujet pour plus de détails.x->(N*x + M) mod 10^8
, oùgcd(N, 10^8) == 1)
. L'avantage de cette approche est inutile d'essayer.Pourquoi ne pas tout simplement garder le dernier numéro attribué, et l'augmenter de 1 lors de l'attribution d'une nouvelle carte d'identité? Interloqué.Incrément peut être utile. Vous pouvez remplir le nombre de zéros à gauche à 8 chiffres. À l'aide de
int
que la sauvegarde de type devrait être suffisant.Edit: si vous voulez que le nombre look aléatoire, qu'à stocker dans la base de données non allouées, des numéros d'ordre eux-mêmes, mais l'utilisation de certains bijection. Par exemple, vous pouvez stocker
7461873*ID + 17845612
à la place. Cela permet de garantir l'unicité et semble aléatoire.Par la manière, ce qui est similaire comment les générateurs de nombres aléatoires pour habitude de travailler (ils les seuls à ne pas utiliser le numéro séquentiel, mais plutôt le résultat du calcul précédent).
private static int _sequentialNum = 0; private string GetNextNumber() {return Interlocked.Increment(ref _sequentialNum).ToString("d8"); }
. La méthode Increment ajuste à Int32.MaxValue, si vous vous souciez de négatifs et de numéros de gros alors utiliser Interloqué.D'échange pour remettre à 0 en tant que de besoin.Vous pourriez essayer de mettre en œuvre une méthode qui génère un nombre aléatoire, mais vous avez toujours pour vérifier si il est déjà dans la base de données.
Utilisation Séquentielle Guid! Réduit la probabilité d'un affrontement où guid déjà avoir une faible probabilité de collisions et également vous pouvez commander vos données par le Guid, qui représente le moment de l'insertion.
Vous pouvez mettre cette méthode dans la classe de base pour les clients, ou de toutes les entités et de l'avoir généré automatiquement dans le constructeur de base sur instatiation.
Vous pouvez utiliser
Random Class
Rappelez-vous toujours qu'il n'y a pas de technique pour générer un nombre Aléatoire unique sans vérifier les valeurs existantes dans la base de données
Vous devez avoir quelques informations concernant les valeurs précédentes
Vous pouvez également utiliser ma identifier générateur. Mais ce n'est pas un entier malheureusement. Assurez-vous que vous avez la casse colonne ID en db autrement modifier la plage de caractères. L'identifiant est l'url de l'amicale. Basé sur une partie de DateTime Tiques (10 caractères) et partielle Aléatoire (6 caractères). Il n'est pas sortable donc utiliser AddedDate colonne au lieu d'obtenir une ligne de séquence. Utilisation
varchar(16)
type de colonne etSQL_Latin1_General_CP1_CS_AS
classement.De Test De L'Unité:
Bonne chance.
RandomString(6)
? aussiIdentifyGenerator.WebHash()
crée une chaîne de caractères de longueur16
pas8
.