【发布时间】:2012-09-16 19:45:03
【问题描述】:
.NET 4.5 包含一个名为CreditCardAttribute 的新验证属性,该属性指定数据字段值是信用卡号。当我反编译包含这个类的程序集时,我可以看到以下用于信用卡号码验证的代码:
public override bool IsValid(object value)
{
if (value == null)
{
return true;
}
string text = value as string;
if (text == null)
{
return false;
}
text = text.Replace("-", "");
text = text.Replace(" ", "");
int num = 0;
bool flag = false;
foreach (char current in text.Reverse<char>())
{
if (current < '0' || current > '9')
{
return false;
}
int i = (int)((current - '0') * (flag ? '\u0002' : '\u0001'));
flag = !flag;
while (i > 0)
{
num += i % 10;
i /= 10;
}
}
return num % 10 == 0;
}
有人知道这里应用了哪种算法来验证数字格式吗?卢恩算法?另外,这是ISO标准吗?最后,您认为这是正确且 100% 正确的实现吗?
MSDN 没有提供太多关于此的信息。事实上,他们的错误信息如下:
备注
使用正则表达式验证值。班级不 验证信用卡号对购买有效,只有 它的格式很好。
【问题讨论】:
-
看起来像 Luhn's 的一个不太高效的实现
-
@SWeko 谢谢!我真的没有太多关于正确算法的信息。您是否有或知道任何更好的方法来验证信用卡类型以 100% 正确?还是根本不可能?
-
@tugberk 如果您正在处理付款,我使用的 API 有一个预身份验证步骤,用于验证卡号并确认其有效性(可能还有余额?)。您调用它,然后处理您的订单并批准预授权步骤。您可以使用该步骤来验证卡。
-
@KirkBroadhurst 谢谢柯克!是的,你是对的。我使用的那个也有这个验证步骤。但是,如果这不是一个动态变化的标准并且可能以 100% 正确的方式实施,那么在早期验证这一点并避免网络调用的成本会很棒。
-
@KirkBroadhurst 我也遵循这条规则。但是在最后的支付阶段(当用户发送支付输入时),我希望能够(如果可能的话)在去其他服务之前查看信用卡是否格式正确。当他们现在将其纳入 .NET Framework 时,我认为此实现应该是 100% 正确的,但我不能确定,因为我不知道标准算法。
标签: c# .net algorithm validation credit-card