C# 将当前日期编码为短的唯一字符串
我需要将当前日期时间编码为一些唯一的字符串,以将其存储在数据库中。 我找到了这篇文章,但对我来说,生成的标记太长了(34个符号) 是否有其他类似的方法来编码较短的字符串C# 将当前日期编码为短的唯一字符串,c#,string,date,encoding,unique,C#,String,Date,Encoding,Unique,我需要将当前日期时间编码为一些唯一的字符串,以将其存储在数据库中。 我找到了这篇文章,但对我来说,生成的标记太长了(34个符号) 是否有其他类似的方法来编码较短的字符串 完美尺寸我会问为什么?你想干什么?如果您想给日志条目之类的内容加时间戳,那么只需使用datetime值——我知道的每种数据库类型都有一个内置的日期/时间类型 如果您试图生成一个唯一的Id用作主键之类的东西,那么这将是一个坏主意-我还没有找到一个使用基于日期的唯一Id的好例子 最好有一个自动递增的整数,甚至GUID值。如果需要,
完美尺寸我会问为什么?你想干什么?如果您想给日志条目之类的内容加时间戳,那么只需使用datetime值——我知道的每种数据库类型都有一个内置的日期/时间类型 如果您试图生成一个唯一的Id用作主键之类的东西,那么这将是一个坏主意-我还没有找到一个使用基于日期的唯一Id的好例子 最好有一个自动递增的整数,甚至GUID值。如果需要,您可以在数据库中添加一个时间戳列您可以使用记号(例如DateTime.Ticks),但不要将记号存储为简单的字符串,而是对位进行编码。如果你使用一个长勾(64位),你应该考虑字节,所以它不会超过10个符号。
var tickBytes = BitConverter.GetBytes(DateTime.UtcNow.Ticks);
string encodedTicks = new Ascii85().Encode(tickBytes);
如果您选择32位刻度,则以64为基数应该可以
对于精度为秒的可读记号(精度低于上一个解决方案) 这将在300年内保持在10个字符或更少。好的,如果你想从“大约现在”到将来某个时间点,你想要秒粒度,你想要ASCII符号,让我们假设base64 使用base64的8个字符,我们可以对6个字节的数据进行编码。这将给我们248个不同的值,这允许大约900万年的时间。考虑到这个范围,我们最好使用
DateTime.Ticks
属性并除以每秒的Ticks,而不用担心纪元。如果需要,稍后将提供完整代码,但作为步骤列表:
- 采用
DateTime.UtcNow.Ticks
- 除以
TimeSpan.TicksPerSecond
- 将结果转换为
,例如使用字节[]
位转换器。GetBytes(长)
- 使用
Convert.ToBase64String
var chars=“abcdefghijklmnopqrstuvwxyz012456789”;var random=new random();var result=new string(Enumerable.Repeat(chars,8)。选择(s=>s[random.Next(s.Length)]).ToArray();
)然后,当用户传递一些令牌时,转到表存储并通过该令牌获取一些数据。但这会增加请求数,所以我尽量避免it@JonSkeet,DateTime.UtcNow
这是我想要编码的内容。@user3770925:这并不能回答我的任何问题。它只用于访问网站上的隐藏页面,不需要非常复杂的代码强大的安全性,但..因此int参数的情况将太不安全..您能绝对保证不会同时收到两个请求吗?尽管使用DateTime.Ticks参数可能会为您提供所需的解决方案,但这意味着任何人都可能访问该页面
long origin = new DateTime(2014, 7, 24).Ticks / TimeSpan.TicksPerSecond;
long customTicks = (DateTime.UtcNow.Ticks / TimeSpan.TicksPerSecond) - origin;
string readableTicks = customTicks.ToString(CultureInfo.InvariantCulture);