基于时间刻度的唯一,非重复的字母数字代码

时间:2012-04-24 13:38:31

标签: c# linq random

我从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(比我现实生活中更多),那么生成的代码将为ACE或{{1}取决于它是否基于0(我不关心它是否是)。

1 个答案:

答案 0 :(得分:3)

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

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

如果你想清理它:

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

生成的输出示例为OEndimZwsEKRAbAwnvzjoA,但由于替换了+ /=,因此长度可能会有些不可预测。

您可能更喜欢这种格式g.ToString("N"),其格式为58d5381c878b484591568b086296fe8e保证长度为32个字符。