挑战:将图像文件的'修改日期' 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;
}