guid à base64, pour L'URL

Question: y a-t-il une meilleure façon de faire cela?

VB.Net

Function GuidToBase64(ByVal guid As Guid) As String
    Return Convert.ToBase64String(guid.ToByteArray).Replace("/", "-").Replace("+", "_").Replace("=", "")
End Function

Function Base64ToGuid(ByVal base64 As String) As Guid
    Dim guid As Guid
    base64 = base64.Replace("-", "/").Replace("_", "+") & "=="

    Try
        guid = New Guid(Convert.FromBase64String(base64))
    Catch ex As Exception
        Throw New Exception("Bad Base64 conversion to GUID", ex)
    End Try

    Return guid
End Function

c#

public string GuidToBase64(Guid guid)
{
    return Convert.ToBase64String(guid.ToByteArray()).Replace("/", "-").Replace("+", "_").Replace("=", "");
}

public Guid Base64ToGuid(string base64)
{
   Guid guid = default(Guid);
   base64 = base64.Replace("-", "/").Replace("_", "+") + "==";

   try {
       guid = new Guid(Convert.FromBase64String(base64));
   }
   catch (Exception ex) {
       throw new Exception("Bad Base64 conversion to GUID", ex);
   }

   return guid;
}
37
demandé sur neminem 2009-06-23 16:51:09

4 réponses

je comprends que la raison pour laquelle vous coupez == à la fin est que parce que vous pouvez être certain que pour GUID (de 16 octets), chaîne encodée sera toujours se termine avec ==. Ainsi 2 caractères peuvent être sauvés dans chaque conversion.

à côté du point @Skurmedal déjà mentionné (devrait jeter une exception en cas de chaîne invalide comme entrée), je pense que le code que vous avez posté est juste assez bon.

9
répondu Hemant 2009-06-23 13:04:31

vous pouvez consulter ce site: http://prettycode.org/2009/11/12/short-guid /

ça ressemble à ce que vous faites.

public class ShortGuid
{
    private readonly Guid guid;
    private readonly string value;

    /// <summary>Create a 22-character case-sensitive short GUID.</summary>
    public ShortGuid(Guid guid)
    {
        if (guid == null)
        {
            throw new ArgumentNullException("guid");
        }

        this.guid = guid;
        this.value = Convert.ToBase64String(guid.ToByteArray())
            .Substring(0, 22)
            .Replace("/", "_")
            .Replace("+", "-");
    }

    /// <summary>Get the short GUID as a string.</summary>
    public override string ToString()
    {
        return this.value;
    }

    /// <summary>Get the Guid object from which the short GUID was created.</summary>
    public Guid ToGuid()
    {
        return this.guid;
    }

    /// <summary>Get a short GUID as a Guid object.</summary>
    /// <exception cref="System.ArgumentNullException"></exception>
    /// <exception cref="System.FormatException"></exception>
    public static ShortGuid Parse(string shortGuid)
    {
        if (shortGuid == null)
        {
            throw new ArgumentNullException("shortGuid");
        }
        else if (shortGuid.Length != 22)
        {
            throw new FormatException("Input string was not in a correct format.");
        }

        return new ShortGuid(new Guid(Convert.FromBase64String
            (shortGuid.Replace("_", "/").Replace("-", "+") + "==")));
    }

    public static implicit operator String(ShortGuid guid)
    {
        return guid.ToString();
    }

    public static implicit operator Guid(ShortGuid shortGuid)
    {
        return shortGuid.guid;
    }
}
22
répondu JamesBrownIsDead 2014-03-01 21:54:13

un problème avec l'utilisation de cette technique pour formater un GUID pour une utilisation dans une URL ou un nom de fichier est que deux GUID distincts peuvent produire deux valeurs qui diffèrent seulement dans le cas, par exemple:

var b1 = GuidToBase64(new Guid("c9d045f3-e21c-46d0-971d-b92ebc2ab83c"));
var b2 = GuidToBase64(new Guid("c9d045f3-e21c-46d0-971d-b92ebc2ab8a4"));
Console.WriteLine(b1);  // 80XQyRzi0EaXHbkuvCq4PA
Console.WriteLine(b2);  // 80XQyRzi0EaXHbkuvCq4pA

étant donné que les URLs et les noms de fichiers sont souvent interprétés comme insensitifs à la casse, cela pourrait conduire à des collisions.

14
répondu Joe 2016-09-29 13:36:53

si votre méthode ne peut pas convertir la Base64 qui lui a été transmise à un GUID, ne devriez-vous pas faire une exception? Les données transmises à la méthode est clairement faux.

3
répondu Skurmedel 2009-06-23 13:06:54