将当前日期编码为短唯一字符串

时间:2014-07-24 14:47:32

标签: c# string date encoding unique

我需要将当前日期时间编码为一些唯一的字符串,以将其存储在数据库中。 我找到了这篇文章how to generate a unique token which expires after 24 hours?,但对我来说,生成的令牌是长(34个符号)

是否有其他类似的方法来编码较短的字符串?


完美尺寸< = 10个符号。

3 个答案:

答案 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)
  • 对最不重要的6位进行编码(对于使用byte[]
  • ,使用字节顺序无效 - 使用Convert.ToBase64String的第一个或最后6个字节作为base64