Pregunta

Desafío: convierta una 'fecha modificada' DateTime de un archivo de imagen a un número / cadena de versión adecuado para mantener la singularidad en una URL, por lo que cada modificación de la imagen genera una URL única, el número de versión / cadena es lo más corto posible.

La escasez de código es secundaria a la falta de disculpas de número/cadena si esto realmente no califica para el estado del código de golf :-)

Requisitos

  • C#, .NET Framework v4
  • La salida debe ser caracteres válidos para un nombre de carpeta en una URL.
  • La precisión de fecha y hora se puede reducir al minuto más cercano.

EDITAR: Esto no es completamente teórico / rompecabezas, así que supongo que prefiero mantenerlo aquí que en Code-Golf Stack Exchange.

¿Fue útil?

Solución

Utilizar el DateTime.Ticks propiedad y luego conviértalo en un número de base 36. Será muy corto y utilizable en una URL.

Aquí hay una clase para convertir a/desde la base 36:

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

También podría usar la base 62, pero no la base64, ya que uno de los dígitos adicionales en la base 64 más allá de los números y las letras es + Lo que debe codificar la URL y usted dijo que quería evitar eso.

Otros consejos

Ok, combinando respuestas y comentarios, se me ocurren lo siguiente.
Nota: Eliminación de bytes de acolchado cero y diferencia de fecha de inicio desde el inicio del proyecto para reducir el tamaño de los números.

    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;
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top