将DateTime转换为尽可能短的版本号(对于url)



挑战:将图像文件的'修改日期' DateTime转换为适合保持url唯一性的版本号/字符串,因此每次修改图像都会生成一个唯一的url,版本号/字符串要尽可能短。

code的长度仅次于number/string的长度如果这不符合代码高尔夫状态的要求,请道歉:-)

需求
    c#, .Net framework v4
  • 输出必须是url中文件夹名的有效字符。
  • DateTime精度可以降低到最接近分钟。

编辑:这并不完全是理论/谜题,所以我想我宁愿把它留在这里而不是代码高尔夫堆栈交换?

使用DateTime.Ticks属性,然后将其转换为36进制数。这将是非常简短和可用的URL。

这是一个用于与Base 36进行转换的类:

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新