【问题标题】:unique, non-repeating alphanumeric code based on time ticks基于时间刻度的唯一、非重复字母数字代码
【发布时间】:2012-04-24 13:38:31
【问题描述】:

我有一个从this post 获取的函数,效果很好:

private string GenerateTransactionCode()
{
    var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    var random = new Random();
    var result = new string(
        Enumerable.Repeat(chars, 8)
                  .Select(s => s[random.Next(s.Length)])
                  .ToArray());
    return result;
}

我想修改它,使它不是随机的,而是根据DateTime.UtcNow.Ticks 选择字母数字数字。这样就不会重复了。我想可能需要根据毫秒的长度增加生成的 TransactionCode 中的字符?我希望生成的 TransactionCode 的长度保持不变。希望不超过 8 个字符。

示例:如果刻度恰好是135(对我来说比现实生活中更多),那么生成的代码将是ACEBDF,这取决于它是否基于0 (我不在乎它是否存在)。

【问题讨论】:

  • 滴答声不是不重复的……尤其是在多核上;然而,一个简单的联锁计数器将是......数据库IDENTITYGuid(显然是适当构造的)
  • 我认为你不想这样做。现代 CPU 不仅能够在滴答计数器的分辨率上做不止一件事。请参阅here 了解更多信息。
  • 我认为您的示例并不代表您想要的,在这种情况下,只会使用 AJ(除非 135 不是十进制值)。
  • 我在想如果刻度是 135,那么它会从数组中挑选出来。 135是字符“数组”中BDF的索引值

标签: c# linq random


【解决方案1】:

我想你真正想要的是一个真正的非重复交易代码,或者GUID

Guid g = Guid.NewGuid();
string txcode = Convert.ToBase64String(g.ToByteArray());

如果你想清理它:

txcode = txcode.Replace("=","").Replace("+","").Replace("/","");

生成的输出示例为OEndimZwsEKRAbAwnvzjoA,但由于+ /= 的替换,长度可能会稍微不可预测。

您可能更喜欢这种格式 g.ToString("N"),它提供类似于 58d5381c878b484591568b086296fe8e 的内容,并且保证长度为 32 个字符。

【讨论】:

  • 长度会保持不变吗?如果没有,我可以这样做吗?
猜你喜欢
  • 1970-01-01
  • 2013-12-07
  • 2012-03-02
  • 2012-12-24
  • 2011-07-13
  • 1970-01-01
  • 1970-01-01
  • 2012-08-16
  • 2016-04-27
相关资源
最近更新 更多