我需要将当前日期时间编码为一些唯一的字符串,以将其存储在数据库中。 我找到了这篇文章how to generate a unique token which expires after 24 hours?,但对我来说,生成的令牌是长(34个符号)
是否有其他类似的方法来编码较短的字符串?
完美尺寸< = 10个符号。
答案 0 :(得分:1)
我问为什么?你想做什么?如果你想为日志条目添加时间戳,那么只需使用datetime值 - 我所知道的每种数据库类型都有内置的日期/时间类型。
如果您尝试生成一个唯一的ID用作主键,那么这将是一个坏主意 - 我还没有找到一个使用基于日期的唯一ID的好案例。
拥有自动递增的整数甚至GUID值会好得多。如果您愿意,可以将时间戳列添加到数据库
答案 1 :(得分:1)
您可以使用tick(例如DateTime.Ticks),但不要将tick作为简单字符串存储,对这些位进行编码。如果你使用长标记(64位),你应该考虑ASCII85 encoding的字节,所以它不会超过10个符号。
var tickBytes = BitConverter.GetBytes(DateTime.UtcNow.Ticks);
string encodedTicks = new Ascii85().Encode(tickBytes);
如果选择32位刻度线,则底座64应该没问题。
对于精确到秒的可读滴答(比先前的解决方案更精确)
long origin = new DateTime(2014, 7, 24).Ticks / TimeSpan.TicksPerSecond;
long customTicks = (DateTime.UtcNow.Ticks / TimeSpan.TicksPerSecond) - origin;
string readableTicks = customTicks.ToString(CultureInfo.InvariantCulture);
这将在10个或更少的时间内保持约300年。
答案 2 :(得分:0)
好的,如果你想要它“从现在开始”到将来的某个点,并且你想要秒粒度,并且你想要ASCII符号,那么我们假设是base64。
使用base64的8个字符,我们可以编码6个字节的数据。这将给我们2个 48 不同的值,这允许大约900万年的秒数。鉴于这个范围,我们不妨使用DateTime.Ticks
属性并除以每秒的刻度,而不是担心时代。如果您需要完整代码,请将其作为一个步骤列表:
DateTime.UtcNow.Ticks
TimeSpan.TicksPerSecond
byte[]
,例如BitConverter.GetBytes(long)
byte[]
Convert.ToBase64String
的第一个或最后6个字节作为base64