18位数唯一ID - 代码可靠性

001*_*001 5 c# asp.net uniqueidentifier

我想要一个永远独一无二的数字,我想出了以下代码,它生成一个数字并在其末尾添加一个校验位,我想知道这段代码有多可靠?

public void GenerateUniqueNumber(out string ValidUniqueNumber) {
        string GeneratedUniqueNumber = "";

        // Default implementation of UNIX time of the current UTC time
        TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
        string FormatedDateTime = Convert.ToInt64(ts.TotalSeconds).ToString();
        string ssUniqueId = DateTime.UtcNow.ToString("fffffff");
        //Add Padding to UniqueId
        string FormatedUniqueId = ssUniqueId.PadLeft(7, '0'); 

        if (FormatedDateTime.Length == 10 && FormatedUniqueId.Length == 7)
        {
            // Calculate checksum number using Luhn's algorithm.
            int sum = 0;
            bool odd = true;
            string InputData = FormatedDateTime + FormatedUniqueId;
            int CheckSumNumber;

            for (int i = InputData.Length - 1; i >= 0; i--)
            {
                if (odd == true)
                {
                    int tSum = Convert.ToInt32(InputData[i].ToString()) * 2;
                    if (tSum >= 10)
                    {
                        string tData = tSum.ToString();
                        tSum = Convert.ToInt32(tData[0].ToString()) + Convert.ToInt32(tData[1].ToString());
                    }
                    sum += tSum;
                }
                else
                    sum += Convert.ToInt32(InputData[i].ToString());
                odd = !odd;
            }
            //CheckSumNumber = (((sum / 10) + 1) * 10) - sum;
            CheckSumNumber = (((sum + 9) / 10) * 10) - sum;

            // Compute Full length 18 digit UniqueNumber
            GeneratedUniqueNumber = FormatedDateTime + FormatedUniqueId + Convert.ToString(CheckSumNumber);
        }
        else
        {
            // Error
            GeneratedUniqueNumber = Convert.ToString(-1);
        }

        ValidUniqueNumber = GeneratedUniqueNumber;        
    }
Run Code Online (Sandbox Code Playgroud)

编辑:澄清GUID不能使用,需要通过电话键盘将数字输入IVR系统.

Fah*_*dah 6

您不能使用GUID,但您可以创建自己的唯一编号格式,类似于GUID,它基于机器的MAC地址(空格)和当前时间和日期(时间).如果机器都具有同步时钟,则保证这是唯一的.

有关详细信息,请参阅此处


And*_*are 5

你为什么不用一个Guid

  • @Aaronaught:不需要嘲笑他.如果他已经知道一切,他就不需要问一个问题了.请参阅常见问题解答中的"很好"部分:http://stackoverflow.com/faq (9认同)
  • Guid只是一个128位的数字."字母"只是该数字的十六进制表示 - 更容易以这种方式阅读. (3认同)
  • 但如果他的限制是十进制格式的18位数,那么GUID会太大,对吧? (2认同)
  • @Matthew:如果你从GUID开始砍掉它,它就不再是全局唯一的.这真是个糟糕的主意. (2认同)
  • @Matthew,GUID不是随机的.它们是全球唯一的,因为它们包含MAC地址(唯一的,全局管理的)和准确的高分辨率时间戳.因此,它们是时空坐标,如果我们没有MAC地址冲突,它们就不可能发生冲突.有关说明,请参见http://blogs.msdn.com/b/oldnewthing/archive/2008/06/27/8659071.aspx (2认同)