首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成随机唯一码

生成随机唯一码
EN

Stack Overflow用户
提问于 2011-05-05 06:18:13
回答 12查看 9.8K关注 0票数 8

我需要生成一个9位数字的数字代码(最好是随机的),它对于给定的一天是唯一的(相同的数字不能在同一天再次生成)。我正在考虑使用HHMMSSmmm (小时、分钟、秒和毫秒)来生成唯一的代码,但并不是真的随机的。这个代码生成方法可以同时被多个方法访问,所以我必须对该方法设置一个锁。但是,这会确保数字是唯一的,因为生成数字的时间可能少于1毫秒,两个线程得到相同的数字吗?

有没有更好的方法来生成一个随机唯一的数字代码,它在给定的一天内是唯一的?数字的数目可以从6位到9位。

编辑:要生成的随机数的数量取决于事务的数量。最初,这个数字可能较低,但在一段时间内会变得非常高(每秒有多个事务)。因此,我不想将这个数字与使用过的列表进行比较,因为这可能会导致性能问题。

随机性是需要的,因为这个号码将由用户在电话中输入。这个号码是连接在线交易与电话交易的唯一方式,所以我不希望用户错误地输入不同的号码。

随机数生成需要在ASP.NET MVC应用程序中进行。

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2011-05-13 01:41:57

如果你从一个6位数的随机数开始,然后继续添加随机数,但足够小的数字,你可以做到这一点。如果你想.你可以用文件系统作为锁定存储器.但是我认为你应该使用DB来进行生产!

这里是我所说的例子:

此示例是一个控制台应用程序,它使用文件控制并发性,并存储最后使用的编号和生成的日期。

如果您多次运行它,您将看到发生了什么。两者都会有自己独特的数字。

它的不会存储所有生成的数字,就像你所需要的那样!

该样本每天可生成约999000个随机数,包括6位数和9位数。大约是每秒11个数字。

代码语言:javascript
复制
using System;
using System.IO;
namespace _5893408
{
    class Program
    {
        static void Main(string[] args)
        {
            Random rand = new Random();
            var futureTime = DateTime.Now.AddSeconds(60);
            while (DateTime.Now < futureTime)
                Console.WriteLine(GetNextNumber(rand));
        }

        public static int GetNextNumber(Random rand)
        {
            var now = DateTime.Now;
            string filePath = @"C:\num.txt";
            FileStream fileStream = null;
            while (fileStream == null)
            {
                try { fileStream = File.Open(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None); }
                catch { }
            }
            using (fileStream)
            {
                DateTime date;
                int prevNum;
                if (fileStream.Length == 0)
                {
                    date = now;
                    prevNum = rand.Next(100000, 999999);
                }
                else
                {
                    var reader = new StreamReader(fileStream);
                    {
                        date = DateTime.Parse(reader.ReadLine());
                        prevNum = int.Parse(reader.ReadLine());
                    }
                    if (date.DayOfYear != now.DayOfYear)
                        prevNum = rand.Next(100000, 999999);
                }
                int nextNum = prevNum + rand.Next(10, 1000);
                fileStream.Seek(0, SeekOrigin.Begin);
                using (var writer = new StreamWriter(fileStream))
                {
                    writer.WriteLine(now);
                    writer.WriteLine(nextNum);
                }
                return nextNum;
            }
        }
    }
}

我认为这满足了你的要求..。我错了吗?

如果是的话,就告诉我,我会尽力帮你的。

票数 4
EN

Stack Overflow用户

发布于 2011-05-05 06:21:04

编辑:当我意识到每天需要有多个唯一的代码时,这个答案是没有意义的,但是它们可以在第二天重复。如果您每天都在寻找一个唯一的代码(不管出于什么原因),那么这个答案是有用的:)

所以如果代码每天都是唯一的,那么就用日期作为代码.

也许是YYYYmmdd,它会给你(今天的日期) 20110505,明天是20110506。

票数 1
EN

Stack Overflow用户

发布于 2011-05-05 06:21:30

它只需要在这个过程中是唯一的吗?

有什么理由不只是保留一个计数器,你每次原子地增加,然后重置它,如果日期翻滚?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5893408

复制
相关文章

相似问题

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