【发布时间】:2010-06-26 14:19:50
【问题描述】:
我想要一个永远唯一的数字,我想出了以下代码, 它生成一个数字并在其末尾添加一个校验位,我想知道这个代码有多可靠?
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;
}
编辑:澄清 不能使用 GUID,需要通过电话键盘将号码输入 IVR 系统。
【问题讨论】:
-
您能否向我们提供有关您使用它的上下文的更多详细信息?例如,为什么你只想要数字(
Guid无论如何)? -
IVR 系统中使用的号码是什么?某种身份?确认号码?越详细越好!
-
需要输入IVR系统,所以不能使用GUID。另外要求号码最多只能是18位。
-
@Matthew,是的,IVR 会提示用户使用他的手机或电话键盘将号码输入系统,然后它会验证号码。
-
在哪种情况下独一无二?数字是在一个中心位置生成的(如果是,一个简单的整数,每个数字递增,会起作用),还是必须在多个独立设备上动态生成?每个设备是否都有一个唯一的标识符,可以用作 ID 的一部分?
标签: c# asp.net uniqueidentifier