【问题标题】:Generate unique serial numbers for mass produced products为批量生产的产品生成唯一的序列号
【发布时间】:2015-02-23 11:24:08
【问题描述】:

我需要帮助了解如何解决为批量生产的产品生成唯一序列号或 UID 的问题。

我将批量生产产品,截至目前,我认为我将生产 >50000 件产品。当这些单元制造完成并准备就绪后,我必须在发货前对其进行测试,届时我还想为每个单元分配一个唯一 ID。

我正在考虑编写一个应用程序来生成一个128 位唯一数字生成器应用程序,并要求测试人员在他们的夹具上运行它,生成一个 ID,分配 ID,然后进行测试。

但我的问题是,请看下面的插图,如果我的同一个应用程序运行在 3 个(或更多)不同的夹具上同时并行,我如何确保这些系统生成的数字永远不会彼此相等?

我如何以编程方式确保 Unique Serial #1 != Unique Serial #2 != Unique Serial #3

如果他们有任何机会平等,一旦他们出去,我将很难追踪他们。

有一些硬件方法,例如使用 Atmel 或 Maxim 的 UID 芯片/EEPROM,但它们会增加成本。我希望在软件层面解决这个问题,并将硬件方法作为最后的手段。

我发现测试夹具能够运行 C#Python 应用程序。

请帮忙!

【问题讨论】:

  • 想法 A:让每台机器上的程序将 UID 插入全局 UID 数据库,并在生成新 UID 时检查该数据库?
  • 无论您使用什么公式,请确保在每批中为三个夹具允许足够的唯一 ID,如果您开始进一步生产,请再次执行相同操作
  • 想法 B:在每个生成的 UID 前面/附加生成器机器自己的唯一序列号?
  • twitter 已经为他们的目的解决了这个问题:github.com/twitter/snowflake
  • 围绕这些序列号是否还有其他特定要求。例如,必须具有维护生成和分配它们的顺序等属性。下面的答案中已经建议的 GUID 是否符合您的需求?

标签: c# python uniqueidentifier unique-key


【解决方案1】:

我遇到了类似的情况,solved it 借助集中式“生成器”(SQL 中的一个存储过程)。

表结构:

CREATE TABLE [dbo].[UniqueKeys](
    [Id] [bigint] IDENTITY(1,1) NOT NULL,
    [App] [nvarchar](100) NOT NULL,
    [System] [nvarchar](100) NOT NULL,
    [Key] [bigint] NOT NULL
) ON [PRIMARY]

这是 SP 的代码:

    CREATE PROCEDURE [dbo].[GetUniqueKeyTV]
        @app VARCHAR(100) ,
        @sys VARCHAR(100) ,
        @retVal BIGINT OUT
    AS 
        BEGIN
            DECLARE @T TABLE([Key] BIGINT);
            SET NOCOUNT ON

            MERGE INTO dbo.UniqueKeys WITH (TABLOCK) AS Target
                USING ( VALUES
                    ( @app ,
                      @sys ,
                      1
                    ) ) AS Source ( [App], [System], [Key] )
                ON ( Target.App = Source.App
                     AND Target.[System] = Source.[System]
                   )
                WHEN MATCHED 
                    THEN UPDATE
                        SET     Target.[Key] = Target.[Key] + 1 
                WHEN NOT MATCHED BY TARGET 
                    THEN 
           INSERT  (
                  [App] ,
                  [System] ,
                  [Key]

                ) VALUES
                ( Source.[App] ,
                  Source.[System] ,
                  Source.[Key]

                ) OUTPUT 
                   inserted.[Key] INTO @T;
            SELECT  @retVal = [Key]
            FROM    @T

            SET NOCOUNT OFF
        END

    GO

它允许您为应用程序和系统创建序列号,但您可以对其进行修改以满足特定需求。

【讨论】:

    【解决方案2】:

    您需要的是 GUID 生成器。由网络 ID 和时间组成的 GUID 被认为是唯一的。重复的可能性很小。

    【讨论】:

    猜你喜欢
    • 2015-05-03
    • 2012-11-30
    • 2015-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多