Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将当前日期编码为短的唯一字符串_C#_String_Date_Encoding_Unique - Fatal编程技术网

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

C# 将当前日期编码为短的唯一字符串,c#,string,date,encoding,unique,C#,String,Date,Encoding,Unique,我需要将当前日期时间编码为一些唯一的字符串,以将其存储在数据库中。 我找到了这篇文章,但对我来说,生成的标记太长了(34个符号) 是否有其他类似的方法来编码较短的字符串 完美尺寸我会问为什么?你想干什么?如果您想给日志条目之类的内容加时间戳,那么只需使用datetime值——我知道的每种数据库类型都有一个内置的日期/时间类型 如果您试图生成一个唯一的Id用作主键之类的东西,那么这将是一个坏主意-我还没有找到一个使用基于日期的唯一Id的好例子 最好有一个自动递增的整数,甚至GUID值。如果需要,

我需要将当前日期时间编码为一些唯一的字符串,以将其存储在数据库中。 我找到了这篇文章,但对我来说,生成的标记太长了(34个符号)

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



完美尺寸我会问为什么?你想干什么?如果您想给日志条目之类的内容加时间戳,那么只需使用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

到目前为止您已经尝试了什么?您需要什么粒度?(日期很简单-yyyyMMdd。我想您需要的不止这些。)哦,还有什么范围的值?(例如,只有21世纪的值?只有2014年到2024年之间的值?所有这些都很重要…)@K.B,我将这些令牌存储到Azure表存储中。下面是生成随机5个符号令牌的想法(
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);