J'ai besoin d'un identifiant unique dans .NET (je ne peux pas utiliser le GUID car il est trop long pour ce cas).
Les gens pensent-ils que l'algorithme utilisé ici est un bon candidat ou avez-vous d'autres suggestions?
c#
.net
uniqueidentifier
Noel
la source
la source
Réponses:
Celui-ci est bon - http://www.singular.co.nz/blog/archive/2007/12/20/shortguid-a-shorter-and-url-friendly-guid-in-c-sharp.aspx
et aussi ici GUID de type YouTube
Vous pouvez utiliser Base64:
la source
J'utilise une approche similaire à celle de Dor Cohen, mais en supprimant certains caractères spéciaux:
Cela ne produira que des caractères alphanumériques. Il n'est pas garanti que les UID aient toujours la même longueur. Voici un exemple d'exécution:
la source
Conservez une date de référence (qui dans ce cas est le 1er janvier 2016) à partir de laquelle vous commencerez à générer ces identifiants. Cela rendra vos identifiants plus petits.
Numéro généré: 3af3c14996e54
la source
milliseconds
est toujours 0 pour cetDateTime
objetPaquet utilisable simple. Je l'utilise pour le générateur d'identifiant de demande temporelle.
https://www.nuget.org/packages/shortid
https://github.com/bolorundurowb/shortid
Les usages
System.Random
(à partir de la page github)
Si vous souhaitez contrôler le type d'identifiant généré en spécifiant si vous voulez des nombres, des caractères spéciaux et la longueur, appelez la méthode Generate et passez trois paramètres, le premier un booléen indiquant si vous voulez des nombres, le second un booléen indiquant si vous le souhaitez caractères spéciaux, le dernier un nombre indiquant votre préférence de longueur.
la source
Pour autant que je sache, il n'est pas garanti que le simple fait de retirer une partie d'un GUID soit unique - en fait, c'est loin d'être unique.
La chose la plus courte que je connaisse qui garantit l'unicité mondiale est présentée dans ce billet de blog de Jeff Atwood . Dans l'article lié, il discute de plusieurs façons de raccourcir un GUID et, à la fin, le réduit à 20 octets via le codage Ascii85 .
Cependant, si vous avez absolument besoin d'une solution ne dépassant pas 15 octets, je crains que vous n'ayez pas d'autre choix que d'utiliser quelque chose qui n'est pas garanti d'être unique au monde.
la source
Les valeurs IDENTITY doivent être uniques dans une base de données, mais vous devez être conscient des limites ... par exemple, cela rend les insertions de données en masse pratiquement impossibles, ce qui vous ralentira si vous travaillez avec un très grand nombre d'enregistrements.
Vous pouvez également utiliser une valeur de date / heure. J'ai vu plusieurs bases de données où ils utilisent la date / heure pour être le PK, et même si ce n'est pas super propre, cela fonctionne. Si vous contrôlez les insertions, vous pouvez effectivement garantir que les valeurs seront uniques dans le code.
la source
Pour mon application locale, j'utilise cette approche basée sur le temps:
la source
ici ma solution, n'est pas sûre pour la concurrence, pas plus de 1000 GUID par seconde et thread-safe.
code non optimisé, juste un échantillon !.
la source
UtcNow
renvoie une valeur tique unique pour chaque milliseconde: par les remarques , la résolution dépend de la minuterie du système. De plus, vous feriez mieux de vous assurer que l'horloge système ne change pas en arrière! (Étant donné que la réponse de user13971889 a placé cette question en haut de mon flux et que j'ai critiqué cette réponse, je suppose que je devrais répéter cette critique ici.)Si votre application n'a pas quelques MILLIION personnes, en utilisant cela génère une courte chaîne unique au même MILLISECOND, vous pouvez penser à utiliser la fonction ci-dessous.
remplacez aaaa par aa si vous devez simplement utiliser votre application au cours des 99 prochaines années.
Mise à jour 20160511 : Fonction aléatoire correcte
- Ajouter un objet Lock
- Déplacer une variable aléatoire hors de la fonction RandomString
Ref
la source
lock
est de vous permettre de réutiliser la mêmeRandom
instance. Je pense que vous avez oublié de supprimer cette ligne!Je sais que c'est assez loin de la date de publication ... :)
J'ai un générateur qui ne produit que 9 caractères hexa , par exemple: C9D6F7FF3, C9D6FB52C
la source
Basé sur la réponse de @ dorcohen et le commentaire de @ pootzko. Vous pouvez utiliser ceci. C'est sûr sur le fil.
la source
Jzhw2oVozkSNa2IkyK4ilA2
ou essayez vous-même sur dotnetfiddle.net/VIrZ8jSur la base de quelques autres, voici ma solution qui fournit un guid encodé différent qui est sûr pour les URL (et Docker) et ne perd aucune information:
Les exemples de sorties sont:
la source
En C #, une
long
valeur a 64 bits, qui si elle est encodée avec Base64, il y aura 12 caractères, dont 1 remplissage=
. Si nous coupons le remplissage=
, il y aura 11 caractères.Une idée folle ici est que nous pourrions utiliser une combinaison d'époque Unix et d'un compteur pour une valeur d'époque pour former une
long
valeur. L'époque Unix en C #DateTimeOffset.ToUnixEpochMilliseconds
est aulong
format, mais les 2 premiers octets des 8 octets sont toujours 0, car sinon la valeur de la date et de l'heure sera supérieure à la valeur maximale de la date et de l'heure. Cela nous donne donc 2 octets pour placer unushort
compteur.Ainsi, au total, tant que le nombre de génération d'ID ne dépasse pas 65536 par milliseconde, nous pouvons avoir un ID unique:
la source
Usage
Ce n'est pas sorcier de se reconvertir, donc je vous laisse autant.
la source
Si vous n'avez pas besoin de taper la chaîne, vous pouvez utiliser ce qui suit:
Cela convertira le Guid en une chaîne de 8 caractères comme ceci:
{b77a49a5-182b-42fa-83a9-824ebd6ab58d} -> "䦥 띺 ᠫ 䋺 ꦃ 亂 檽 趵"
{c5f8f7f5-8a7c-4511-b667-8ad36b446617} -> " 엸 詼 䔑 架 펊 䑫 ᝦ"
la source
Voici ma petite méthode pour générer un identifiant unique aléatoire et court. Utilise un rng cryptographique pour la génération sécurisée de nombres aléatoires. Ajoutez les caractères dont vous avez besoin à la
chars
chaîne.la source
pour ne pas perdre de caractères (+ / -) et si vous voulez utiliser votre guid dans une url, il faut le transformer en base32
pour 10 000 000 pas de clé en double
la source
Vous pouvez essayer avec la bibliothèque suivante:
la source
la source
UtcNow
renvoie une valeur de graduation unique pour chaque milliseconde: selon les remarques , la résolution dépend de la minuterie du système. De plus, vous feriez mieux de vous assurer que l'horloge système ne change pas en arrière! (La réponse de ur3an0 a également ces problèmes.)vous pouvez utiliser
ses
6
beaux caractères seulement,599527
,143354
et lorsque l'utilisateur le virifie simplement
j'espère que cela vous aidera
la source
la source
J'utilise
Guid.NewGuid().ToString().Split('-')[0]
, il obtient le premier élément du tableau séparé par le '-'. Il suffit de représenter une clé unique.la source