通过加密生成唯一编号
本文关键字:唯一 编号 加密 | 更新日期: 2023-09-27 18:32:41
我正在使用Visual Studio 2013
,iis-8.5
,.net 4.5.1
在我的项目中,我想创建8 digit unique number
,它应该用中间的'hypen'
分隔,前缀为 "MNOP-"
.生成的8 digit
应继承Cryptography class
。
我的代码
var bytes = new byte[4];
var rng = RandomNumberGenerator.Create();
rng.GetBytes(bytes);
int random = BitConverter.ToInt32(bytes, 0) % 100000000;
var data = "ABCD-" + random.ToString("####-####");
我按 'for loop'
创建了 10000 个值,但有些'random variable'
返回负值
提前谢谢。
您可以做三件事:
- 生成一个随机值(十进制数字一个十进制数字(并检查您之前是否创建过它,然后将其存储到预先生成的数字列表中;
- 创建一个 400 到 800 MB 的表并对其进行洗牌,然后将其存储在磁盘上并使用偏移量到表中;
- 创建一个密钥并将其用于使用与输入完全相同的输出的密码(PRP(,并使用计数器,基本上实现格式保留加密。
您不应该只使用随机数生成器,因为碰撞的机会会随着生成的数字数量而迅速增加。这是因为生日问题。
这也意味着,如果您想生成大量数字,则解决方案1(不适合,因为它可能会停滞不前。想象一下,你只剩下一个可用的数字,你有一个 400 MB 的表,它正在尝试剩下的一个 4 字节条目。其他选项要求您分别存储表和偏移量或键和计数器。
您当前的生成方法是不平衡的,因为它比正数更容易生成较低的数字。此外,您应该重置最高有效位,因为ToInt32
返回有符号的两个补码值,并且%
是余数运算符,而不是模运算符。
好的,只为这一次,一些C#代码,庆祝我的平台铜牌:
namespace StackOverflow
{
class RandomIDGenerator
{
private const string FORMAT = "ABCD-####-####";
private const string TEST_FORMAT = "ABCD-###";
private RandomNumberGenerator rng = RandomNumberGenerator.Create();
private byte[] b = new byte[1];
private SortedSet<string> previousIDs = new SortedSet<string>();
private char GenerateRandomDigit()
{
int x;
do
{
rng.GetBytes(b);
x = b[0] & 0xFF;
} while (x >= 250);
int y = x % 10;
return (char) ('0' + y);
}
private String GenerateRandomID()
{
StringBuilder sb = new StringBuilder(TEST_FORMAT);
for (int i = 0; i < sb.Length; i++)
{
if (sb[i] == '#')
{
sb[i] = GenerateRandomDigit();
}
}
return sb.ToString();
}
public String GenerateUniqueRandomID()
{
string id;
do
{
id = GenerateRandomID();
}
while (previousIDs.Contains(id));
previousIDs.Add(id);
return id;
}
public static void Main(String[] args)
{
RandomIDGenerator gen = new RandomIDGenerator();
for (int i = 0; i < 500; i++)
{
Console.WriteLine(gen.GenerateUniqueRandomID());
}
Console.WriteLine("Put breakpoint here...");
foreach (string id in gen.previousIDs)
{
Console.WriteLine(id);
}
Console.WriteLine(gen.previousIDs.Count);
Console.WriteLine("Put breakpoint here...");
}
}
}