我使用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字符串
谢谢
答案 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;