2009-09-22 14 views
39

Est-il possible de générer un GUID court comme dans YouTube (N7Et6c9nL9w)?GUID semblable à YouTube

Comment cela peut-il être fait? Je veux l'utiliser dans une application Web.

Répondre

38

Vous pouvez utiliser base64:

string base64Guid = Convert.ToBase64String(Guid.NewGuid().ToByteArray()); 

qui génère une chaîne comme E1HKfn68Pkms5zsZsvKONw==. Comme un GUID est toujours à 128 bits, vous pouvez omettre le == qui sera toujours présent à la fin et qui vous donnera une chaîne de 22 caractères. Ce n'est pas aussi court que YouTube.

+21

Cette méthode présente l'inconvénient que, les valeurs générées peuvent contenir le signe slash (/), qui peut, quand improprement traité, être gênant pour l'utilisation dans Url –

+2

Bien que j'aime vraiment cette solution, je suis d'accord avec Jhonny D. non seulement '/' peut apparaître, mais aussi '+' ce qui va totalement casser votre URL. * sigh * – c0d3p03t

+2

Remplacez simplement les caractères '/' et '+' par des caractères sécurisés, comme '-' et '_'. Ensuite, en lisant le guid, replacez-les avant de décoder. –

3

Techniquement, ce n'est pas un Guid. Youtube a un générateur de chaînes aléatoire simple que vous pouvez probablement fouetter en quelques minutes en utilisant un tableau de caractères autorisés et un générateur de nombres aléatoires.

1

Cet identifiant n'est probablement pas globalement unique. Les GUID doivent être globalement uniques car ils incluent des éléments qui ne devraient pas apparaître ailleurs (l'adresse MAC de la machine générant l'ID, l'heure de génération de l'ID, etc.)

Si vous avez besoin d'un ID unique votre application, utilisez une fontaine de chiffres - en encodant peut-être la valeur en nombre hexadécimal. Chaque fois que vous avez besoin d'un identifiant, récupérez-le dans la fontaine des chiffres.

Si vous avez plusieurs serveurs allouant des ID, vous pouvez saisir une série de nombres (quelques dizaines ou milliers selon la rapidité avec laquelle vous allouez des ID) et cela devrait faire l'affaire. un numéro hexadécimal à 8 chiffres vous donnera 4 milliards d'identifiants - mais vos premiers identifiants seront beaucoup plus courts.

10

9 caractères ne sont pas des indications. Étant donné cela, vous pouvez utiliser la représentation hexadécimale d'un int, ce qui vous donne une chaîne de 8 caractères.

Mise à jour 1: J'sais pourquoi ci-dessus a obtenu un downvote, mais pour ceux qui se demandent:

Vous pouvez utiliser un identifiant vous peut-être déjà. Aussi, vous pouvez utiliser .GetHashCode contre différents types simples et là vous avez un int différent. Vous pouvez également xor différents champs. Et si vous y êtes, vous pouvez même utiliser un nombre aléatoire - hey, vous avez bien au-dessus de 2.000.000.000+ valeurs possibles si vous respectez les points positifs;)

+0

Je me demande aussi que ... en tout cas, je viens de poster une mise à jour donnant qui donne des raisons supplémentaires de faire le contraire - upvote :) – eglasius

3

Ce n'est peut-être pas la meilleure solution, mais vous pouvez faire quelque chose comme ça:

string shortUrl = System.Web.Security.Membership.GeneratePassword(11, 0); 
+0

Le seul problème avec cette méthode est que le 2ème argument est en fait pour le nombre minimum de non -les caractères alphabétiques et non numériques. Quand j'essaye avec '0' j'obtiens plusieurs de ces symboles ... – Azimuth

4

comme d'autres l'ont mentionné, VideoId de YouTube n'est pas techniquement un GUID car il est pas intrinsèquement unique.

Comme par Wikipedia:

Le nombre total de clés uniques est 2 ou 3,4 × 10 . Ce nombre est donc grand que la probabilité du même nombre généré aléatoirement deux fois est négligeable.

L'unicité VideoId de YouTube est gérée par son algorithme de générateur.

Vous pouvez soit écrire votre propre algorithme, soit utiliser un générateur de chaînes aléatoires et utiliser la contrainte UNIQUE CONSTRAINT dans SQL pour renforcer son unicité.

Tout d'abord, créez un UNIQUE CONSTRAINT dans votre base de données:

ALTER TABLE MyTable 
ADD CONSTRAINT UniqueUrlId 
UNIQUE (UrlId); 

Ensuite, par exemple, générer une chaîne aléatoire (à partir de philipproplesch answer):

string shortUrl = System.Web.Security.Membership.GeneratePassword(11, 0); 

Si le produit UrlId est suffisamment aléatoire et suffisamment longtemps, vous devriez rarement rencontrer l'exception qui est levée lorsque SQL rencontre un doublon UrlId. Dans un tel cas, vous pouvez facilement gérer l'exception dans votre application Web.

+0

Le seul problème avec la méthode' GeneratePassword' est que le 2ème argument est réellement pour le nombre minimum de caractères non-alphabétiques et non-nombres. Quand j'essaye avec '0' j'obtiens plusieurs de ces symboles ... – Azimuth

5

Comme mentionné dans la réponse acceptée, il peut poser problème si vous utilisez le GUID dans l'URL. Voici une réponse plus complète:

public string ToShortString(Guid guid) 
    { 
     var base64Guid = Convert.ToBase64String(guid.ToByteArray()); 

     // Replace URL unfriendly characters with better ones 
     base64Guid = base64Guid.Replace('+', '-').Replace('/', '_'); 

     // Remove the trailing == 
     return base64Guid.Substring(0, base64Guid.Length - 2); 
    } 

    public Guid FromShortString(string str) 
    { 
     str = str.Replace('_', '/').Replace('-', '+'); 
     var byteArray = Convert.FromBase64String(str + "=="); 
     return new Guid(byteArray); 
    } 

Utilisation:

 var guid = Guid.NewGuid(); 
     var shortStr = ToShortString(guid); 
     // shortStr will look something like 2LP8GcHr-EC4D__QTizUWw 
     var guid2 = FromShortString(shortStr); 
     Assert.AreEqual(guid, guid2);