我需要生成一个9位数字的数字代码(最好是随机的),它对于给定的一天是唯一的(相同的数字不能在同一天再次生成)。我正在考虑使用HHMMSSmmm (小时、分钟、秒和毫秒)来生成唯一的代码,但并不是真的随机的。这个代码生成方法可以同时被多个方法访问,所以我必须对该方法设置一个锁。但是,这会确保数字是唯一的,因为生成数字的时间可能少于1毫秒,两个线程得到相同的数字吗?
有没有更好的方法来生成一个随机唯一的数字代码,它在给定的一天内是唯一的?数字的数目可以从6位到9位。
编辑:要生成的随机数的数量取决于事务的数量。最初,这个数字可能较低,但在一段时间内会变得非常高(每秒有多个事务)。因此,我不想将这个数字与使用过的列表进行比较,因为这可能会导致性能问题。
随机性是需要的,因为这个号码将由用户在电话中输入。这个号码是连接在线交易与电话交易的唯一方式,所以我不希望用户错误地输入不同的号码。
随机数生成需要在ASP.NET MVC应用程序中进行。
发布于 2011-05-13 01:41:57
如果你从一个6位数的随机数开始,然后继续添加随机数,但足够小的数字,你可以做到这一点。如果你想.你可以用文件系统作为锁定存储器.但是我认为你应该使用DB来进行生产!
这里是我所说的例子:
此示例是一个控制台应用程序,它使用文件控制并发性,并存储最后使用的编号和生成的日期。
如果您多次运行它,您将看到发生了什么。两者都会有自己独特的数字。
它的不会存储所有生成的数字,就像你所需要的那样!
该样本每天可生成约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;
}
}
}
}我认为这满足了你的要求..。我错了吗?
如果是的话,就告诉我,我会尽力帮你的。
发布于 2011-05-05 06:21:04
编辑:当我意识到每天需要有多个唯一的代码时,这个答案是没有意义的,但是它们可以在第二天重复。如果您每天都在寻找一个唯一的代码(不管出于什么原因),那么这个答案是有用的:)
所以如果代码每天都是唯一的,那么就用日期作为代码.
也许是YYYYmmdd,它会给你(今天的日期) 20110505,明天是20110506。
发布于 2011-05-05 06:21:30
它只需要在这个过程中是唯一的吗?
有什么理由不只是保留一个计数器,你每次原子地增加,然后重置它,如果日期翻滚?
https://stackoverflow.com/questions/5893408
复制相似问题