取消

Luhn算法

Luhn算法(Luhn algorithm),也称为“模10”(Mod 10)算法,是一种简单的校验和算法,一般用于验证身份识别码,例如发卡行识别码、国际移动设备辨识码(IMEI),美国国家提供商标识号码,或是加拿大社会保险号码。该算法由IBM科学家Hans Peter Luhn创造,专利于1954年1月6日申请,1960年8月23日颁证,美国专利号2950048。 该算法现已属于公有领域并得到了广泛的应用,例如ISO/IEC 7812-1。它不是一种安全的加密哈希函数,设计它的目的只是防止意外出错而不是恶意攻击。 来自百度百科


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public int CalculateSum(IEnumerable<int> digits, int bitShift = 0)
{
    var sum = digits.Reverse()
        .Select((digit, i) =>
        (i + bitShift) % 2 == 0 ? digit * 2 > 9 ? digit * 2 - 9 : digit * 2 : digit)
        .Sum();
    return sum;
}
public int GenerateCheckDigit(IEnumerable<int> digits)
{
    var sum = CalculateSum(digits);
    var lastDigit = 10 - sum % 10;
    return lastDigit;
}
public static bool IsLuhnValid(int[] digits)
{
    var sum = CalculateSum(digits, 1);
    return sum % 10 == 0;
}
public static int[] GetDigitsArrayFromCardNumber(string cardNumber)
{
    var digits = cardNumber.Select(p => p - '0').ToArray();
    return digits;
}
void Main()
{
    var digits1 = "7992739871".Select(i => i - '0').ToList();
    GenerateCheckDigit(digits1);//3
}

参考资料

本文会经常更新,请阅读原文: https://dashenxian.github.io/post/Luhn%E7%AE%97%E6%B3%95 ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

知识共享许可协议

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 小神仙 (包含链接: https://dashenxian.github.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 (125880321@qq.com)

登录 GitHub 账号进行评论