C# 如何生成12位数的唯一数字?

C# 如何生成12位数的唯一数字?,c#,unique,uniqueidentifier,C#,Unique,Uniqueidentifier,我正在开发一个应用程序,将原始数据发送到zebra打印机并打印条形码。由于每个项目都有自己独特的条形码,我需要定义一个变量,自动生成12位数的唯一数字 见示例: printBar prnt = new printBar("123456789012"); 是否需要定义一个双变量并将其传递给一个函数,该函数只返回12位数字,然后将其再次传递给printBar类?。但是如何确保每次访问它时都返回唯一的值呢 我还想到了另一种方法,因为我使用MS Access db,我可以创建一列AutoNumber数

我正在开发一个应用程序,将原始数据发送到zebra打印机并打印条形码。由于每个项目都有自己独特的条形码,我需要定义一个变量,自动生成12位数的唯一数字

见示例:

printBar prnt = new printBar("123456789012");
是否需要定义一个双变量并将其传递给一个函数,该函数只返回12位数字,然后将其再次传递给printBar类?。但是如何确保每次访问它时都返回唯一的值呢


我还想到了另一种方法,因为我使用MS Access db,我可以创建一列AutoNumber数据类型并将其分配给Random,但您无法获得所需的确切12位数字,有时它会生成10位数字的值,有时甚至更多或更少。

从12位数字开始,即:111111

要获得新的“随机”唯一数字,请取上一个数字并加1


虽然不是随机的,但它将保证唯一性

以12位数字开始,即:111111

要获得新的“随机”唯一数字,请取上一个数字并加1


虽然不是随机的,但它将保证唯一性

使用RNG和哈希do:

10-输出12位数字
20-检查值是否在哈希中
30-如果是转到40,则转到10
40-将值推入哈希
50-返回新的12位数字

60-使用RNG和哈希do转到10



10-输出12位数字
20-检查值是否在哈希中
30-如果是转到40,则转到10
40-将值推入哈希
50-返回新的12位数字

60-转到10

您每天、每小时、每分钟生成新条形码多少次

您可以使用类似VisualStudioWorks的自动版本控制技术

  • 从某个特定日期算起的天数(如1.1.2000)
    • 填充0到5个位置
  • 几秒钟过去了,直到午夜
    • 填充也有0到5个位置
  • 在应用程序中,用静态计数器填充最后两个数字,该计数器仅在99左右
例子 使用这种方法,您将在15分钟时得到溢出。2273年10月,但我认为这可以由你的追随者解决

如果每秒需要创建超过100个唯一ID,可以将最后两行更改为:

var counter = _InternalCounter++ % 1000;
return days.ToString("0000") + seconds.ToString("00000") + counter.ToString("000");
现在,每秒将有1000个唯一ID,但在18天时,天数已经溢出。2027年5月。如果时间太短,如果您通过以下行将开始日期设置为2010年,您可以获得额外的十年:

var days = (int)(now - new DateTime(2010, 1, 1)).TotalDays;

您每天、每小时、每分钟生成新条形码多少次

您可以使用类似VisualStudioWorks的自动版本控制技术

  • 从某个特定日期算起的天数(如1.1.2000)
    • 填充0到5个位置
  • 几秒钟过去了,直到午夜
    • 填充也有0到5个位置
  • 在应用程序中,用静态计数器填充最后两个数字,该计数器仅在99左右
例子 使用这种方法,您将在15分钟时得到溢出。2273年10月,但我认为这可以由你的追随者解决

如果每秒需要创建超过100个唯一ID,可以将最后两行更改为:

var counter = _InternalCounter++ % 1000;
return days.ToString("0000") + seconds.ToString("00000") + counter.ToString("000");
现在,每秒将有1000个唯一ID,但在18天时,天数已经溢出。2027年5月。如果时间太短,如果您通过以下行将开始日期设置为2010年,您可以获得额外的十年:

var days = (int)(now - new DateTime(2010, 1, 1)).TotalDays;
您可以简单地使用:

var temp = Guid.NewGuid().ToString().Replace("-", string.Empty);
var barcode = Regex.Replace(temp,"[a-zA-Z]", string.Empty).Substring(0, 12);
您可以简单地使用:

var temp = Guid.NewGuid().ToString().Replace("-", string.Empty);
var barcode = Regex.Replace(temp,"[a-zA-Z]", string.Empty).Substring(0, 12);


你能在10位数字的前面加上0吗?你需要多少个,它们是否只需要在给定的跑步中是唯一的,或者它们必须是“永远”唯一的?我需要它永远是无限和唯一的。“我需要它永远是无限和唯一的”-根据定义只有10^12位数字。总有一天你会用完的。你能在10位数字的前面加上0吗?你需要多少,它们是否只需要在给定的跑步中是唯一的,或者它们必须是“永远”唯一的?我需要它永远是无限和唯一的。“我需要它永远是无限和唯一的”-根据定义只有10^12位数字。总有一天你会用完。谢谢,但该值将在应用程序重新启动时重置。你可以发布一个示例代码吗?将该值存储在一个公共位置,如数据库,并从中生成数字。谢谢,但该值将在应用程序重新启动时重置。你可以发布一个示例代码吗?将值存储在一个公共位置,例如数据库,然后从那里生成数字。下面是我所做的:static Random r=new Random();静态int randomId(){int n=r.Next(9999999999999);返回n;}并且它可以工作。对randomId()的每次调用都返回随机数。@丹:是,它返回一个随机数,但不是唯一数。要获得唯一的数字,您必须知道您已经创建了哪些数字,或者必须使用其他唯一性(如日期/时间戳)@丹:只是一个最新的描述,关于你做了什么以及后果是什么:这里是我做的:静态随机r=新随机();静态int randomId(){int n=r.Next(9999999999999);返回n;}并且它可以工作。对randomId()的每次调用都返回随机数。@丹:是,它返回一个随机数,但不是唯一数。要获得唯一的数字,您必须知道您已经创建了哪些数字,或者必须使用其他唯一性(如日期/时间戳)@丹:只是一个最新的描述,关于你做了什么以及后果是什么:你的代码可以生成12位数字,但在安全模式下并不好,因为数字很容易猜测生成后会出现什么。@Tringuendung:有一个唯一的数字和一个随机(不可预测)的唯一数字是不同的事情。如果您需要第二种方法,我的方法将不起作用,但这不是问题所在。您的代码可以