将当前日期编码为短唯一字符串
本文关键字:唯一 字符串 当前日期 编码 | 更新日期: 2023-09-27 18:14:32
我需要将当前日期时间编码为一些唯一的字符串以存储在数据库中。我发现这篇文章如何生成一个在24小时后到期的唯一令牌?但对我来说,生成的token是长(34个符号)
是否有其他类似的方法来编码较短的字符串?
我想问为什么?你想干什么?如果你想给日志之类的东西加上时间戳,那么就使用datetime值——我知道的每种数据库类型都有一个内置的日期/时间类型。
如果你想生成一个唯一的Id作为一个主键,那么这将是一个坏主意-我还没有找到一个很好的情况下使用基于日期的唯一Id。
使用一个自动递增的整数或者GUID值会更好。如果需要,可以向数据库添加时间戳列
您可以使用tick (DateTime)。但不要将tick存储为简单的字符串,而是对比特进行编码。如果你使用一个长刻度(64位),你应该考虑字节的ASCII85编码,这样它就不会超过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年。
好的,如果你想从"大约现在"到未来的某个时间点,并且你想要秒粒度,并且你想要ASCII符号,让我们假设base64。
使用base64的8个字符,我们可以编码6字节的数据。这将给我们248不同的值,这允许大约900万年的秒。考虑到这个范围,我们不妨使用DateTime.Ticks
属性,除以每秒滴答数,而不用担心epoch。如果需要,稍后会提供完整的代码,但以步骤列表的形式提供:
- 取
DateTime.UtcNow.Ticks
- 除以
TimeSpan.TicksPerSecond
- 将结果转换为
byte[]
,例如使用BitConverter.GetBytes(long)
- 编码最低有效的6位(我无望与端序-
byte[]
的前6或后6字节作为base64使用Convert.ToBase64String