生成随机唯一代码

Ach*_*khi 8 .net c# random algorithm

我需要生成一个九位数字代码(最好是随机的),它对于给定的一天是唯一的(同一天不能再生成相同的数字).我正在考虑使用HHMMSSmmm(小时,分钟,秒和毫秒)来生成唯一代码但不是真正随机的.这个代码生成方法可以同时通过多种方法访问,因此我必须对该方法进行锁定.但这是否会确保数字是唯一的,因为数字生成可能需要不到一毫秒而两个线程可以获得相同的数字?

有没有更好的方法来生成随机唯一数字代码,这在特定的一天是唯一的?位数可以是6到9位数.

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

需要随机性,因为该号码将由用户在电话上输入.此号码是将在线交易与电话交易相关联的唯一方式,因此我不希望用户错误地输入不同的号码.

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

Mig*_*elo 4

如果您从 6 位数字的随机数开始,然后不断添加随机但足够小的数字,您也许能够做到这一点。如果需要,您可以使用文件系统作为锁定存储...但我认为您应该使用数据库进行生产!

这是我正在谈论的示例:

此示例是一个控制台应用程序,它使用文件来控制并发性,并存储上次使用的数字及其生成日期。

如果您多次运行它,您就会看到会发生什么。两者都有自己独特的编号。

不会像您所要求的那样存储所有生成的数字!

该样本每天可以生成约 999000 个随机数,范围为 6 到 9 位(含)。也就是每秒大约 11 个数字。

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;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

如果是的话,请告诉我,我会尽力提供更多帮助。