CreditCardAttribute使用哪种算法进行信用卡号格式validation

.NET 4.5包含一个名为CreditCardAttribute的新validation属性,该属性指定数据字段值是信用卡号。 当我反编译包含此类的程序集时,我可以看到以下代码用于信用卡号validation:

 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()) { if (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; } 

有谁知道这里应用了哪种算法来validation数字格式? Luhn的算法? 另外,这是ISO标准吗? 最后,你认为这是正确的,100%正确的实施?

MSDN没有提供有关此内容的更多信息。 事实上,他们有错误的信息如下:

备注

使用正则表达式validation该值。 该类不会validation信用卡号是否对购买有效,只是它的格式正确。

最后一行:

 return num % 10 == 0; 

这是一个非常强烈的提示,这是一个Luhn算法

这个算法实际上是Luhn的算法。 不幸的是,并非所有卡号都可以通过此算法validation,因此它不是100%方法。 但是,允许键入的卡号输入的万事达卡和维萨卡产品的卡号应通过此检查。

validation卡号是否存在的唯一100%方法是执行交易。 通常用于PoS连接的收集器主机系统协议具有validation卡是否不在停止列表中并存在于路由表中的规定。