生成必须遵循某些规则的唯一数字的最佳方法是什么?

时间:2008-11-22 08:36:41

标签: language-agnostic

一些背景:在德国(至少)发票号码必须遵循某些规则:

  1. 必须订购
  2. 它们必须是连续的(可能没有间隙)
  3. 几个月后,他们被允许包含字符。有些客户希望使用这种可能性,客户不知道或害怕他们坚持使用仅限数字的发票号码。

    此外,客户不希望在零处启动它们。

    我能想出很多方法来产生这样一个数字吗?我想知道:最好的方法是什么?

4 个答案:

答案 0 :(得分:5)

为了避免从0开始 - 只需从10000开始。忘掉零填充。

您必须考虑何时分配号码。

如果您在首次打开发票进行编辑时分配号码,例如分配号码10014,并且用户取消发票,那么您就有差距,因为您必须记住其他人可能已经拥有开始创建ID为10015的发票,因此您不能只回滚该号码。

如果您在发票完全写入并保存后分配号码,那么您将避免该方案,并且您将避免出现间隙,但您不知道发票之前将具有哪个发票号码它被保存了。

此外,您需要确保它是线程安全的,这样两个用户就无法创建相同的发票号。

static object _invoiceNumberLock = new object();
public static string GetInvoiceNumber()
{
    lock(_invoiceNumberLock)
    {
        //Connect to database and get MAX(invoicenumber)+1
        //Increase the invoicenumber in SQL database by one
        //Perhaps also add characters
    }
}

还要考虑通过在SQL数据库中的invoicenumber列上使用UNIQUE INDEX来备份唯一性。

答案 1 :(得分:1)

我的两个想法:

  1. (没有字符):一个序列,从1开始,用零填充左边(或者以另一个数字开头并用零填充) - 例如: 1000002554
  2. (使用字符):十六进制基数的序列,用零填充(最后带有前缀) - 示例: AF00CAFE01
  3. 十六进制:>

    包含发票号码会很酷

答案 2 :(得分:0)

对于我的发票,它们总是包含一年中的最后一位数字,后跟一个从4096开始的4位数发票编号,因此您将得到一个类似85021的值。这是为了轻松处理我的账单(最多)15客户每月两次。

现在这是无关紧要的,因为我每年只筹集大约6张发票(我是永久性的,现在只做一小部分工作,大部分时间都是出于投资目的而离开公司),但这个方案对我来说总是有效。

它阻止客户感觉他们正在完成一家小公司的工作(没有1号发票甚至80001号)。

就顺序性而言,发票只是存储在文件名中包含发票编号的文件中,因此很容易创建下一个发票。不需要数据库 - 这实际上取决于您的商店有多大。

答案 3 :(得分:0)

更多想法:

选择一个任意比特序列作为数字的顶部。这将作为一个“魔术键”,因此您可以脱离上下文识别该数字。例如,Newegg产品ID似乎以“N82E”开头,UPS跟踪号似乎以“1Z”开头。

如果您可以弯曲“连续”规则,则将最后一位设为奇偶校验位,以进行错误检查。