Ach*_*khi 8 .net c# random algorithm
我需要生成一个九位数字代码(最好是随机的),它对于给定的一天是唯一的(同一天不能再生成相同的数字).我正在考虑使用HHMMSSmmm(小时,分钟,秒和毫秒)来生成唯一代码但不是真正随机的.这个代码生成方法可以同时通过多种方法访问,因此我必须对该方法进行锁定.但这是否会确保数字是唯一的,因为数字生成可能需要不到一毫秒而两个线程可以获得相同的数字?
有没有更好的方法来生成随机唯一数字代码,这在特定的一天是唯一的?位数可以是6到9位数.
编辑:要生成的随机数的数量取决于事务的数量.最初数量可能较低,但在一段时间内它可能变得非常高(每秒多次交易).因此,我不想将该数字与使用的列表进行比较,因为这可能存在性能问题.
需要随机性,因为该号码将由用户在电话上输入.此号码是将在线交易与电话交易相关联的唯一方式,因此我不希望用户错误地输入不同的号码.
随机数生成需要在ASP.NET MVC应用程序中进行.
如果您从 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)
我认为这满足您的要求...我错了吗?
如果是的话,请告诉我,我会尽力提供更多帮助。