随机字符串概率计算

时间:2015-12-15 14:51:15

标签: c# random cryptography

我使用RNGCryptoServiceProvider从字符a-z / A-Z / 0-9生成256位长度的随机字符串(不是数字)。

我需要在每秒生成<x>令牌时生成一些关于碰撞可行性的统计信息(可能性是多少,以及可能发生的次数),但稍微努力以一种好的方式显示?

是否已经有一个公式用于计算这样的概率?

我看过类似的SHA-256计算,但我不确定它是否完全符合这个模型。

非常感谢任何帮助

编辑:显示的代码

public string Token(int length, string chars)
    {
        using (var generator = new RNGCryptoServiceProvider())
        {
            var bytes = new byte[length];
            generator.GetBytes(bytes);
            var chars = bytes.Select(b =>  availableChars[b%availableChars.Length]);
            var token = new string(chars.ToArray());
            return token;
        }
    }
在这种情况下,

长度为64,可用的字符如图所示,取自0-9A-Za-z字符串

谢谢

2 个答案:

答案 0 :(得分:2)

生成32个随机字节,使用Convert.ToBase64将其转换为字符串。您现在的转换是不必要的。

在网上找到的基本概率理论告诉你这是安全的。没有研究人员曾经产生过256位冲突。

答案 1 :(得分:1)

使用mod(%)时会有一个小偏差。

在&#34; C&#34中查看是否存在重新调整范围的方法。世界有arc4random-uniform()

请参阅How much bias is introduced by the remainder technique?,使用提供的代码:

适应C#

while(true)
{
  int value = rand();
  if (value < RAND_MAX - RAND_MAX % range)
    return value % range;
}

至于随机性,加密安全的随机数发生器应该基本上没有偏差。请检查详细信息WRT您选择的那个。有硬件USB可连接真正的硬件randon数字生成器。

您还可以使用UUID,其中&#34;可以保证跨时空的唯一性。&#34;