将DateTime转换为最短的版本号(对于url)

时间:2011-09-12 03:30:51

标签: c# c#-4.0 compression code-golf

挑战:将图像文件的“修改日期”DateTime转换为适合维护网址唯一性的版本号/字符串,因此图像的每次修改都会生成唯一的网址,即版本号/字符串尽量缩短。

代码的短缺是次要的数字/字符串的短缺 如果这不符合代码 - 高尔夫状态,请道歉: - )

要求

  • C#,。Net framework v4
  • 输出必须是网址中文件夹名称的有效字符。
  • DateTime精度可以降低到最接近的分钟。
编辑:这不完全是理论/拼图,所以我想我宁愿把它放在这里而不是代码 - 高尔夫堆叠交换?

2 个答案:

答案 0 :(得分:2)

使用DateTime.Ticks属性,然后将其转换为基数为36的数字。它将非常短并且可用于URL。

这是一个转换为/从Base 36转换的类:

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

你也可以使用base 62,但不能使用base64,因为base 64中除了数字和字母之外的一个额外数字是+,需要进行url编码,你说你想避免这种情况。

答案 1 :(得分:1)

好的,结合答案和评论,我想出了以下内容 注意:删除零填充字节,并从项目开始开始日期差异,以减少数字的大小。

    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;
    }