【问题标题】:How to generate unique number of 12 digits?如何生成唯一的 12 位数字?
【发布时间】:2011-01-28 21:12:17
【问题描述】:

我正在开发一个将原始数据发送到斑马打印机并打印出条形码的应用程序。而且由于每件商品都有自己唯一的条形码,我需要定义一个变量来自动生成唯一的 12 位数长。

参见示例:

printBar prnt = new printBar("123456789012");

无论如何定义一个双变量并将其传递给一个函数,该函数返回唯一的 12 位数字并再次将其传递给 printBar 类?但是如何确保每次访问它都返回一个唯一值呢?

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

【问题讨论】:

  • 你能在那个 10 位数字前面加 0 吗?
  • 您需要多少个,它们是否只需要对于给定的运行是唯一的,还是必须“永远”是唯一的?
  • 我需要它永远是无限的和独一无二的。
  • “我需要它永远是无限的和独一无二的”——根据定义,只有 10^12 个 12 位数字。总有一天你会用完。

标签: c# unique uniqueidentifier


【解决方案1】:

以十二位数字开头,即:111111111111

要获得新的“随机”唯一号码,请取前一个号码并加 1。

虽然不是随机的,但会保证唯一性。

【讨论】:

  • 谢谢,但该值将在应用重启时重置。你能发布一个示例代码吗?。
  • 将值存储在一个公共位置,例如数据库,并从那里生成数字。
【解决方案2】:

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

您可以使用 Visual Studio 的自动版本控制等技术。

  • 从某个特定日期开始计算天数(例如 1.1.2000)
    • 填充 0 到 5 个位置。
  • 连接到午夜经过的秒数
    • 也填充了零到五个位置。
  • 在您的应用中使用静态计数器填充最后两个数字,该计数器刚好在 99 处环绕。

示例

public static class UniqueId
{
    static private int _InternalCounter = 0;

    static public string Get()
    {
        var now = DateTime.Now;

        var days = (int)(now - new DateTime(2000, 1, 1)).TotalDays;
        var seconds = (int)(now - DateTime.Today).TotalSeconds;

        var counter = _InternalCounter++ % 100;

        return days.ToString("00000") + seconds.ToString("00000") + counter.ToString("00");
    }

使用这种方法,您将在 2273 年 10 月 15 日发生溢出,但我认为这可以由您的追随者解决。 ;-)

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

var counter = _InternalCounter++ % 1000;
return days.ToString("0000") + seconds.ToString("00000") + counter.ToString("000");

现在您每秒将拥有一千个唯一 ID,但在 2027 年 5 月 18 日时,这些天数已经溢出。如果这太短,如果您通过以下行将开始日期设置为 2010 年,您可以获得额外的十年:

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

【讨论】:

  • 你的代码可以生成12位的数字,但是在安全模式下效果不好,因为生成后很容易猜到接下来会发生什么。
  • @TriNguyenDung:拥有唯一编号和随机(不可预测)唯一编号是不同的事情。如果您需要第二个,我的方法将不起作用,但这不是问题。
【解决方案3】:

使用 RNG 和哈希:

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

【讨论】:

  • 这是我所做的: static Random r = new Random();静态 int randomId() { int n = r.Next(999999999999);返回 n;它的工作原理。每次调用 randomId() 都会返回随机数。
  • @Dan:是的,它返回一个随机数,但不是唯一数。要获得一个独特的数字,您必须知道您已经创建了哪些数字,或者您必须使用其他一些独特性(如日期/时间戳)!
  • @Dan:只是目前的描述,关于你做了什么以及后果是什么:blogs.msdn.com/ericlippert/archive/2010/03/22/…
【解决方案4】:

你可以简单地使用:

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

【讨论】:

    猜你喜欢
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多