【问题标题】:Generate serial number using letters and digits使用字母和数字生成序列号
【发布时间】:2012-05-30 16:23:08
【问题描述】:

我正在开发一个使用 C# 和 DevExpress 接受订单的应用程序,我需要一个生成唯一订单号的函数。订单号必须包含字母和数字,长度为 20 .. 我见过像 Guid.NewGuid() 这样的东西,但我不希望它是完全随机的,也不希望它只是一个自动递增的数字..

有人可以帮忙吗?即使它是不同语言的脚本,我也非常需要想法:)

【问题讨论】:

  • 如果你不希望它是随机的,你想要它如何?
  • Guid.NewGuid() 是独一无二的。不是随机的。
  • 类似于自动递增的字符串,十六进制数字,.. 反映数字之间顺序的东西(ord1 在 ord2 之前等等..)
  • 订单号最好通过递增数字来跟踪,你在找什么。举几个例子。
  • 我正在考虑采用作为自动编号的主键,用零填充它直到长度变为 20 .. 但这样我将订单号限制为仅由数字组成..

标签: c# uniqueidentifier autonumber


【解决方案1】:

您可以创建自己的类型。 假设 yyyyMMddWWW-YYY-XXXXXXX 其中 WWW 是商店编号,YYY 收银员 id XXXXXXX 是十六进制数字(-> 可能是您将其转换为十六进制的实际自动增量数字)。这只是一个想法。恐怕您必须根据系统的元素来决定它的样子。

已编辑:如果您可以对其应用校验位算法也将有助于避免错误

【讨论】:

    【解决方案2】:

    两种不同的方法:

    • 创建当前时间的 MD5 或 SHA1 哈希
    • 增量编号的哈希

    【讨论】:

    • 但是当前时间是(想到了一些冲突)您可以使用更强大的算法,例如 SHA256
    【解决方案3】:

    一个想法浮现在脑海。
    将 DateTime.Now.Ticks 转换为十六进制字符串。
    瞧,String.Format("{0:X}", value);
    如果不够长,你说需要 20 位,你可以随时补零。

    【讨论】:

      【解决方案4】:
      1. 获取主板ID
      2. 获取硬盘 ID
      3. 以任何方式合并它
      4. 添加您的密码
      5. 应用 MD5
      6. 应用 Base54

      结果:链接到当前客户端 PC 的序列号 :)

      【讨论】:

        【解决方案5】:

        我的两分钱。

        如果您需要想法,请查看LuhnLuhn mod N 算法。

        虽然这些算法不是唯一的代码生成器,但它们可能会为您提供一些关于如何生成可验证代码的想法(这样您就可以在将代码发送到数据库之前验证代码的正确性)。

        【讨论】:

          【解决方案6】:

          就像 Oded 建议的那样,Guid 不是随机的(好吧,如果您有网卡,则不是)。它基于时间和位置坐标。详细解释见Raymond Chens blog post
          您最好对订单 ID 使用自动递增的 int。我不明白您为什么不想使用它或不使用 Guid?

          除了自动 ID 之外,我想不出任何其他方式来保持唯一性并代表系统中不同订单的顺序。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-01-17
            • 1970-01-01
            • 2022-01-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-07-01
            相关资源
            最近更新 更多