Question

Défi: convertir une «date modifiée» DateTime d'un fichier image sur un numéro de version / chaîne adapté pour maintenir l'unicité dans une URL, de sorte que chaque modification de l'image génère une URL unique, le numéro de version / chaîne pour être aussi court que possible.

La brièveté du code est secondaire à la brièveté des excuses numéro / chaînes si cela ne se qualifie pas vraiment pour le statut de code-golf :-)

Conditions

  • C #, .NET Framework v4
  • La sortie doit être des caractères valides pour un nom de dossier dans une URL.
  • La précision DateTime peut être réduite à la minute la plus proche.

Edit: Ce n'est pas entièrement théorique / puzzle, donc je suppose que je préfère le garder ici que sur l'échange de pile de code-golf?

Était-ce utile?

La solution

Utilisez le DateTime.Ticks propriété, puis le convertir en un numéro de base 36. Ce sera très court et utilisable sur une URL.

Voici une classe pour se convertir vers / depuis la base 36:

http://www.codeproject.com/kb/cs/base36.aspx

Vous pouvez également utiliser la base 62, mais pas la base64, car l'un des chiffres supplémentaires de la base 64 au-delà des chiffres et des lettres est + Ce qui doit être encodé de l'URL et vous avez dit que vous vouliez éviter cela.

Autres conseils

Ok, combinant des réponses et des commentaires que j'ai trouvés ce qui suit.
Remarque: Retrait des octets de rembourrage zéro et différence de date de début par rapport au début du projet pour réduire la taille des nombres.

    public static string GetVersion(DateTime dateTime)
    {
        System.TimeSpan timeDifference = dateTime - new DateTime(2010, 1, 1, 0, 0, 0, DateTimeKind.Utc);
        long min = System.Convert.ToInt64(timeDifference.TotalMinutes);
        return EncodeTo64Url(min);
    }

    public static string EncodeTo64Url(long toEncode)
    {
        string returnValue = EncodeTo64(toEncode);

        // returnValue is base64 = may contain a-z, A-Z, 0-9, +, /, and =.
        // the = at the end is just a filler, can remove
        // then convert the + and / to "base64url" equivalent
        //
        returnValue = returnValue.TrimEnd(new char[] { '=' });
        returnValue = returnValue.Replace("+", "-");
        returnValue = returnValue.Replace("/", "_");

        return returnValue;
    }

    public static string EncodeTo64(long toEncode)
    {
        byte[] toEncodeAsBytes = System.BitConverter.GetBytes(toEncode);
        if (BitConverter.IsLittleEndian)
            Array.Reverse(toEncodeAsBytes);
        string returnValue = System.Convert.ToBase64String(toEncodeAsBytes.SkipWhile(b=>b==0).ToArray());
        return returnValue;
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top