基于客户端ID的唯一随机字母数字字符

时间:2019-06-20 09:39:58

标签: c# random

我想根据客户端ID生成最多50个唯一的字母数字字符串。顺便说一句,获得相同字符串的机会是什么?我有多个客户,我不希望字符串重叠。

这是我打算使用的:

static Random _Random = new Random();
static char[] _AllowedChars =
            Enumerable.Range(48, 10).Select(x => (char)x)
                .Concat(Enumerable.Range(65, 26).Select(x => (char)x))
                .Concat(Enumerable.Range(97, 26).Select(x => (char)x))
                .ToArray();
static string PseudoUniqueString(int maxLength = 50)
            => new string(Enumerable.Range(1, Math.Max(1, maxLength))
                .Select(x => _AllowedChars[_Random.Next(_AllowedChars.Length)])
                .ToArray());

是否可以在此字符串的开头添加客户端ID(例如1)?我没有提出其他解决方案。需要建议。

修改: 该字符串将在Web API中用作交易号,并且将有1个以上的客户端。这就是为什么我要在此字符串中添加客户端ID。

1 个答案:

答案 0 :(得分:0)

出于您的目的(即生成交易号),您应该create an identifier包含一个较长的随机数(例如GUID或使用RNGCryptoServiceProvider类生成的128位或更长的随机数—不是System.Random)。在以下情况之一中,它将被视为唯一:

  • 您的应用程序根据交易的数据库而不是 clients 的数据库检查交易号的唯一性(交易号不一定包含有关导致交易的客户的信息该交易)。或者,
  • 您将事务的记录号(由大多数数据库软件中的事务数据库自动分配)连接到以此方式生成的随机事务号。或者,
  • 您的应用程序可以忍受生成重复随机数的(理论上)风险。如果将随机GUID或更长的随机数用作事务处理号,则可以忽略不计。但是,这种做法只能确保实用唯一性。