首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过密码学生成唯一的数字

通过密码学生成唯一的数字
EN

Stack Overflow用户
提问于 2016-02-01 20:09:52
回答 1查看 244关注 0票数 2

我正在使用Visual Studio 2013iis-8.5.net 4.5.1

在我的项目中,我想创建8 digit unique number,它应该由中间的'hypen'和前缀"MNOP-"分隔。生成的8 digit应该继承Cryptography class

我的代码

代码语言:javascript
复制
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'返回负值

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2016-02-02 01:40:07

您可以做以下三件事:

  1. 生成一个随机值(逐个十进制位)并检查您以前是否创建过它,然后将其存储到预先生成的列表numbers;
  2. create 400到800 MB表中并对其进行混洗,然后将其存储在磁盘上并在表中使用偏移量;
  3. 创建密钥并将其用于使用与输入完全相同的输出的密码( PRP),并使用计数器,基本上实现了格式保留。

您不应该只使用随机数生成器,因为冲突的机会随着生成的数字数量的增加而迅速增加。这是因为生日问题。

这也意味着,如果你想生成大量的数字,解决方案1)是不合适的,因为它可能会停滞。假设您只剩下一个可用的数字,您有一个400MB的表,它正在尝试查找剩下的一个4字节的条目。其他选项需要分别存储表和偏移量,或者键和计数器。

您当前的生成方法是不平衡的,因为它比正数更容易生成较低的数字。此外,您应该重置最高有效位,因为ToInt32返回带符号的二进制补值,而%是余数运算符,而不是模运算符。

好的,仅限于这一次,一些C#代码,来庆祝我在平台上的青铜徽章:

代码语言:javascript
复制
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...");
        }
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35130195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档