ข้ามไปยังเนื้อหา

เครื่องคำนวณอัลกอริทึมลูห์น - ตรวจสอบบัตรเครดิตและ IMEI

เครื่องคำนวณลูห์นมอด 10 ฟรีสำหรับการตรวจสอบบัตรเครดิต การตรวจสอบ IMEI และการยืนยันตัวตน สามารถตรวจสอบหมายเลขหรือสร้างข้อมูลทดสอบออนไลน์ได้ทันที

เครื่องคำนวณอัลกอริทึมลูห์น

การดำเนินการ

ตรวจสอบว่าหมายเลขของคุณผ่านการตรวจสอบลูห์นโมด 10 หรือไม่

เครื่องคำนวณโหลด...
📚

เอกสารประกอบการใช้งาน

ทำความเข้าใจอัลกอริทึมของ Luhn

ต้องการตรวจสอบหมายเลขบัตรเครดิตหรือตรวจสอบ IMEI หรือไม่? อัลกอริทึมของ Luhn (หรือ "อัลกอริทึม mod 10") เป็นสูตรการตรวจสอบผลรวมที่เป็นรากฐานของการยืนยันการชำระเงินมาตั้งแต่ปี 1954 นักวิทยาศาสตร์ของ IBM ชื่อ Hans Peter Luhn ได้ออกแบบการตรวจสอบทางคณิตศาสตร์ที่ชาญฉลาดนี้เพื่อจับข้อผิดพลาดการพิมพ์และข้อผิดพลาดในการถอดความที่เกิดจากการป้อนข้อมูลด้วยตนเอง—เช่น เมื่อคุณสลับหลักเลขโดยไม่ตั้งใจหรือพิมพ์เลขผิด

นี่คือสิ่งที่ทำให้มันมีค่ามาก: เครือข่ายบัตรเครดิตหลัก (Visa, Mastercard, American Express) หมายเลข IMEI ของอุปกรณ์มือถือ หมายเลขประกันสังคมของแคนาดา และตัวระบุผู้ให้บริการด้านสุขภาพของสหรัฐฯ ล้วนพึ่งพาอัลกอริทึมนี้ เมื่อคุณพิมพ์หมายเลขบัตรลงในแบบฟอร์มการชำระเงินและถูกปฏิเสธทันที นั่นคือการตรวจสอบของ Luhn ที่กำลังทำงาน

เครื่องคำนวณนี้ช่วยให้คุณสามารถตรวจสอบลำดับตัวเลขใดๆ หรือสร้างข้อมูลทดสอบที่ผ่านการตรวจสอบ—สิ่งสำคัญเมื่อคุณกำลังสร้างการรวมการชำระเงินหรือทดสอบระบบการระบุโดยไม่ใช้ข้อมูลลูกค้าจริง

วิธีใช้เครื่องคำนวณนี้

การตรวจสอบหมายเลขที่มีอยู่: ป้อนลำดับตัวเลขใดๆ—เช่น บัตรเครดิต 16 หลัก หรือ IMEI 15 หลัก—และคลิก "ตรวจสอบ" คุณจะเห็นทันทีว่าผ่านการตรวจสอบ mod 10 หรือไม่ พร้อมทั้งการแจกแจงขั้นตอนทีละขั้นของวิธีการประมวลผลแต่ละหลัก สิ่งนี้มีประโยชน์อย่างยิ่งเมื่อแก้ไขปัญหาแบบฟอร์มการชำระเงินหรือตรวจสอบความถูกต้องของการป้อนข้อมูล

การสร้างข้อมูลทดสอบ: สลับไปที่โหมด "สร้าง" เพื่อสร้างหมายเลขทดสอบที่ถูกต้องด้วยความยาวใดๆ หมายเลขเหล่านี้ผ่านการตรวจสอบ Luhn แต่ไม่ใช่บัตรที่แท้จริงหรือใช้งานได้—ทำให้เหมาะสมกับสภาพแวดล้อมการพัฒนาที่คุณต้องการกรณีทดสอบที่สมจริงโดยไม่ต้องสัมผัสข้อมูลการชำระเงินสด

ทำความเข้าใจกระบวนการ: การแสดงภาพจะแสดงสิ่งที่เกิดขึ้นกับแต่ละหลักอย่างแน่ชัด: หลักใดที่ถูกคูณสอง เมื่อใดที่ 9 ถูกลบ และวิธีที่ผลรวมสุดท้ายกำหนดความถูกต้อง ฉันพบว่าข้อมูลป้อนกลับทางภาพนี้มีค่ายิ่งเมื่อต้องอธิบายอัลกอริทึมให้กับเพื่อนร่วมงานหรือแก้ไขปัญหาการใช้งาน

วิธีการทำงานของอัลกอริทึมลูห์น

อัลกอริทึมประมวลผลตัวเลขจากขวาไปซ้าย โดยใช้รูปแบบง่ายๆ ที่สามารถจับข้อผิดพลาดการป้อนข้อมูลส่วนใหญ่:

  1. เริ่มจากขวา: หยิบแต่ละหลัก เคลื่อนไปทางซ้าย ทุกสองหลักจะถูกคูณสอง (เหล่านี้คือหลักที่อยู่ในตำแหน่งคู่เมื่อนับจากขวา)

  2. จัดการกับตัวคูณที่มีค่าสูง: เมื่อการคูณสองทำให้ได้ตัวเลขมากกว่า 9 ให้ลบ 9 ออก ซึ่งทางคณิตศาสตร์เทียบเท่ากับการบวกหลักแต่ละหลัก (18 กลายเป็น 1+8=9)

  3. รวมทุกอย่าง: บวกหลักที่ประมวลผลแล้ว - ทั้งหลักที่คูณสองและปรับแล้ว และหลักที่ไม่เปลี่ยนแปลง

  4. ตรวจสอบการหารลงตัว: หากผลรวมหารลงตัวด้วย 10 (ลงท้ายด้วย 0) หมายเลขนั้นถูกต้อง ผลลัพธ์อื่นๆ หมายถึงมีข้อผิดพลาด

สิ่งที่ชาญฉลาดเกี่ยวกับวิธีนี้คือการจับข้อผิดพลาดทั่วไป หากคุณสลับสองหลักที่อยู่ติดกันหรือพิมพ์หลักผิด ผลรวมจะเปลี่ยนแปลงเกือบเสมอ อัลกอริทึมจะไม่สามารถจับข้อผิดพลาดทุกอย่างได้ - ข้อผิดพลาดแฝง เช่น การสลับ 22 เป็น 55 จะหลุดรอด - แต่สามารถจับข้อผิดพลาดแบบสุ่มของหลักเดียวได้ประมาณ 98% และการสลับหลักที่อยู่ติดกันได้ประมาณ 90%

นี่คือการแสดงภาพของกระบวนการ:

ขั้นตอนกระบวนการอัลกอริทึมลูห์น 1. คูณสองทุกหลัก 2. รวมหลัก (9 สำหรับการคูณที่มากกว่า 9) 3. คำนวณผลรวมทั้งหมด 4. ตรวจสอบว่าผลรวม % 10 == 0

สูตรทางคณิตศาสตร์

สำหรับผู้ที่ชอบสัญกรณ์อย่างเป็นทางการ นี่คือนิพจน์ทางคณิตศาสตร์:

ให้ did_i เป็นหลักที่ ii นับจากหลักขวาสุด (ไม่รวมหลักตรวจสอบ) และเคลื่อนไปทางซ้าย แล้วหลักตรวจสอบ d0d_0 จะถูกเลือกเพื่อให้:

(2d2nmod9+d2n1+2d2n2mod9+d2n3++2d2mod9+d1+d0)mod10=0(2d_{2n} \bmod 9 + d_{2n-1} + 2d_{2n-2} \bmod 9 + d_{2n-3} + \cdots + 2d_2 \bmod 9 + d_1 + d_0) \bmod 10 = 0

โดยที่ mod\bmod คือการดำเนินการโมดูโล

การประยุกต์ใช้ในโลกแห่งความเป็นจริง

การประมวลผลการชำระเงิน: เครือข่ายบัตรหลักทุกแห่ง—Visa, Mastercard, American Express, Discover—ใช้การตรวจสอบ Luhn เป็นด่านแรกในการป้องกันข้อผิดพลาดจากการพิมพ์ เมื่อคุณกำลังสร้างแบบฟอร์มการชำระเงิน การใช้การตรวจสอบ Luhn ฝั่งไคลเอ็นต์จะช่วยป้องกันผู้ใช้จากการส่งหมายเลขที่ชัดเจนว่าไม่ถูกต้อง และลดการเรียก API ที่ไม่จำเป็นไปยังเกตเวย์การชำระเงิน

การติดตามอุปกรณ์เคลื่อนที่: หมายเลข IMEI บนโทรศัพท์และแท็บเล็ตมีหลักการตรวจสอบ Luhn รวมอยู่ ซึ่งมีความสำคัญอย่างยิ่งในการจัดการห่วงโซ่อุปทานและระบบการรับรองอุปกรณ์—ฉันเคยเห็นระบบคลังสินค้าปฏิเสธการสแกน IMEI ที่ไม่ถูกต้องทันที ป้องกันข้อผิดพลาดในการจัดส่งก่อนที่จะเกิดขึ้น

ตัวระบุในการดูแลสุขภาพ: ระบบหมายเลขผู้ให้บริการแห่งชาติ (NPI) ของสหรัฐอเมริกาตรวจสอบหมายเลขผู้ให้บริการโดยใช้อัลกอริทึมนี้ ด้วยการทำธุรกรรมด้านสุขภาพหลายล้านรายต่อวัน การจับข้อผิดพลาดในการถอดความหมายเลขผู้ให้บริการป้องกันความล่าช้าในการเรียกเก็บเงินและลดการปฏิเสธการเรียกร้อง

การระบุตัวบุคคลของรัฐบาล: หมายเลขประกันสังคมของแคนาดามีการตรวจสอบ Luhn อัลกอริทึมนี้ให้การตรวจสอบความถูกต้องอย่างรวดเร็วโดยไม่ต้องค้นหาในฐานข้อมูล ทำให้มีประสิทธิภาพสำหรับสถานการณ์การตรวจสอบปริมาณสูง

ระบบหนังสือดั้งเดิม: การใช้งาน ISBN-10 บางแบบใช้ตัวแปร Luhn ถึงแม้ว่า ISBN-13 จะใช้อัลกอริทึมหลักการตรวจสอบที่แตกต่าง แต่ระบบห้องสมุดและสินค้าคงคลังเก่ายังคงพึ่งพาการตรวจสอบที่อิงจาก Luhn

ขั้นตอนการใช้งานแบบทีละขั้นตอน

ตรวจสอบหมายเลขบัตรเครดิต

มาตรวจสอบหมายเลข 4532015112830366:

  1. เริ่มจากด้านขวา: 6, 6, 3, 0, 3, 8, 2, 1, 1, 5, 1, 0, 2, 3, 5, 4
  2. คูณสองเท่าทุกหลักที่สอง (จากขวา): 6, 12, 3, 0, 3, 16, 2, 2, 1, 10, 1, 0, 2, 6, 5, 8
  3. ลบ 9 ออกจากตัวเลขที่มากกว่า 9: 6, 3, 3, 0, 3, 7, 2, 2, 1, 1, 1, 0, 2, 6, 5, 8
  4. ผลรวม: 6+3+3+0+3+7+2+2+1+1+1+0+2+6+5+8 = 50
  5. 50 % 10 = 0 ✓ ถูกต้อง!

ตรวจจับหมายเลข IMEI ที่ไม่ถูกต้อง

ทดสอบ 490154203237518 (หลักสุดท้ายเป็นตัวเลขที่ผิด):

  1. หลังจากการคูณสองเท่าและประมวลผล: ผลรวม = 57
  2. 57 % 10 = 7 ✗ ไม่ถูกต้อง!

ผลรวมไม่ลงท้ายด้วยศูนย์ ดังนั้นอัลกอริทึมจึงระบุว่าไม่ถูกต้อง เพื่อให้ถูกต้อง หลักสุดท้ายควรเป็น 1 ซึ่งจะทำให้ผลรวมเป็น 60 - หารลงตัวด้วย 10 นี่คือวิธีที่อัลกอริทึมตรวจจับข้อผิดพลาดในการถ่ายโอนข้อมูลของตัวระบุอุปกรณ์

อัลกอริทึมการตรวจสอบผลรวมทางเลือก

อัลกอริทึม Luhn เป็นที่นิยมเนื่องจากง่ายต่อการนำไปใช้ แต่มีทางเลือกที่ซับซ้อนมากขึ้นเมื่อคุณต้องการการตรวจจับข้อผิดพลาดที่แม่นยำ:

อัลกอริทึม Verhoeff: ตรวจจับข้อผิดพลาดของหลักเดียวทั้งหมดและเกือบทั้งหมดของข้อผิดพลาดการสลับตำแหน่ง รวมถึงกรณีหลักคู่ที่ Luhn พลาด (เช่น 22↔55) ข้อแลกเปลี่ยนคือความซับซ้อนที่เพิ่มขึ้น—ต้องใช้ตารางค้นหาพร้อมการคูณและการสลับตำแหน่ง ใช้เมื่อความถูกต้องของข้อมูลมีความสำคัญและค่าโอเวอร์เฮดในการคำนวณไม่ใช่ปัญหา

อัลกอริทึม Damm: ตรวจจับข้อผิดพลาดของหลักเดียวทั้งหมดและการสลับตำแหน่งที่อยู่ติดกันโดยไม่มีข้อยกเว้น มีพื้นฐานมาจากการดำเนินการควอซิกรุ๊ปที่สร้างขึ้นพิเศษเพื่อรับประกันการครอบคลุมอย่างสมบูรณ์ การนำไปใช้งานใช้ตารางค้นหาเพียงตารางเดียว ทำให้มีความเรียบง่ายกว่า Verhoeff แต่ยังคงซับซ้อนกว่า Luhn

หลักตรวจสอบ ISBN-13: ใช้อัลกอริทึมโมดูโล 10 แบบถ่วงน้ำหนักที่แตกต่างจาก Luhn และ ISBN-10 น้ำหนักสลับระหว่าง 1 และ 3 ซึ่งให้การตรวจจับข้อผิดพลาดที่ดีสำหรับตัวระบุหนังสือโดยเฉพาะ ระบบนี้แทนที่ระบบ ISBN-10 เก่า (ซึ่งใช้ Luhn) เมื่ออุตสาหกรรมต้องการพื้นที่ตัวระบุมากขึ้น

ประวัติและบริบท

ฮันส์ ปีเตอร์ ลุห์น พัฒนาอัลกอริทึมนี้ที่ IBM ในปี 1954 ในช่วงเริ่มแรกของการประมวลผลข้อมูลอัตโนมัติ ลุห์นเป็นที่รู้จักในงานบุกเบิกด้านการค้นคืนข้อมูล—ระบบดัชนีแบบ KWIC (คำสำคัญในบริบท) ของเขามีอิทธิพลต่อวิธีการค้นหาเอกสารจนถึงทุกวันนี้—แต่อัลกอริทึม mod 10 กลายเป็นผลงานที่ยั่งยืนที่สุดของเขา

นี่คือความแตกต่างที่สำคัญ: ลุห์นออกแบบนี้เพื่อ ตรวจจับข้อผิดพลาด ไม่ใช่ความปลอดภัย ในช่วงทศวรรษ 1950 ปัญหาคือข้อผิดพลาดของบัตรเจาะรูและความผิดพลาดจากการถอดความด้วยมือ ไม่ใช่การฉ้อโกงทางดิจิทัล อัลกอริทึมนี้จับข้อผิดพลาดจากการพิมพ์ผิดได้อย่างยอดเยี่ยม—แต่ไม่ใช่การเข้ารหัส หมายเลข Luhn ที่ถูกต้องไม่ได้หมายความว่าบัตรนั้นใช้งานได้ มีเงิน หรือเป็นของบุคคลที่ใช้มัน

สิ่งที่น่าทึ่งคือวิธีที่อัลกอริทึมอายุ 70 ปียังคงทำหน้าที่ตามวัตถุประสงค์เดิมได้ดีเพียงใด ผู้ประมวลผลการชำระเงินเพิ่มชั้นความปลอดภัยสมัยใหม่ (โทเค็นไนเซชัน การตรวจสอบ CVV, 3D Secure) แต่การตรวจสอบ Luhn ฝั่งไคลเอ็นต์เริ่มแรกนั้นยังคงหยุดข้อผิดพลาดที่ชัดเจนนับล้านก่อนที่จะสิ้นเปลืองแบนด์วิดธ์กับการเรียกเกตเวย์การชำระเงิน

ตัวอย่างการใช้งาน

นี่คือวิธีการใช้งานการตรวจสอบและสร้างหมายเลขตามอัลกอริทึม Luhn ด้วย Python, JavaScript และ Java ตัวอย่างเหล่านี้เน้นความสามารถในการอ่านและประสิทธิภาพ:

1import random
2
3def luhn_validate(number):
4    digits = [int(d) for d in str(number)]
5    checksum = 0
6    for i in range(len(digits) - 1, -1, -1):
7        d = digits[i]
8        if (len(digits) - i) % 2 == 0:
9            d = d * 2
10            if d > 9:
11                d -= 9
12        checksum += d
13    return checksum % 10 == 0
14
15def generate_valid_number(length):
16    digits = [random.randint(0, 9) for _ in range(length - 1)]
17    checksum = sum(digits[::2]) + sum(sum(divmod(d * 2, 10)) for d in digits[-2::-2])
18    check_digit = (10 - (checksum % 10)) % 10
19    return int(''.join(map(str, digits + [check_digit])))
20

ตัวอย่างการใช้งาน:

print(luhn_validate(4532015112830366)) # True print(luhn_validate(4532015112830367)) # False print(generate_valid_number(16)) # สร้างหมายเลขที่ถูกต้อง 16 หลัก

1
2

javascript function luhnValidate(number) { const digits = number.toString().split('').map(Number); let checksum = 0; for (let i = digits.length - 1; i >= 0; i--) { let d = digits[i]; if ((digits.length - i) % 2 === 0) { d *= 2; if (d > 9) d -= 9; } checksum += d; } return checksum % 10 === 0; }

function generateValidNumber(length) { const digits = Array.from({length: length - 1}, () => Math.floor(Math.random() * 10)); const checksum = digits.reduce((sum, digit, index) => { if ((length - 1 - index) % 2 === 0) { digit *= 2; if (digit > 9) digit -= 9; } return sum + digit; }, 0); const checkDigit = (10 - (checksum % 10)) % 10; return parseInt(digits.join('') + checkDigit); }

// ตัวอย่างการใช้งาน: console.log(luhnValidate(4532015112830366)); // true console.log(luhnValidate(4532015112830367)); // false console.log(generateValidNumber(16)); // สร้างหมายเลขที่ถูกต้อง 16 หลัก

1
2

java import java.util.Random;

public class LuhnValidator { public static boolean luhnValidate(long number) { String digits = String.valueOf(number); int checksum = 0; boolean isEven = true; for (int i = digits.length() - 1; i >= 0; i--) { int digit = Character.getNumericValue(digits.charAt(i)); if (isEven) { digit *= 2; if (digit > 9) digit -= 9; } checksum += digit; isEven = !isEven; } return checksum % 10 == 0; }

public static long generateValidNumber(int length) {
    Random random = new Random();
    long[] digits = new long[length - 1];
    for (int i = 0; i < length - 1; i++) {
        digits[i] = random.nextInt(10);
    }
    long checksum = 0;
    for (int i = digits.length - 1; i >= 0; i--) {
        long digit = digits[i];
        if ((length - 1 - i) % 2 == 0) {
            digit *= 2;
            if (digit > 9) digit -= 9;
        }
        checksum += digit;
    }
    long checkDigit = (10 - (checksum % 10)) % 10;
    long result = 0;
    for (long digit : digits) {
        result = result * 10 + digit;
    }
    return result * 10 + checkDigit;
}

public static void main(String[] args) {
    System.out.println(luhnValidate(4532015112830366L));  // true
    System.out.println(luhnValidate(4532015112830367L));  // false
    System.out.println(generateValidNumber(16));  // สร้างหมายเลขที่ถูกต้อง 16 หลัก
}

}

1
2## กรณีขอบเขตและปัญหาในการนำไปใช้งาน
3
4เมื่อนำการตรวจสอบ Luhn ไปใช้ในระบบการผลิต ให้ระวังปัญหาทั่วไปเหล่านี้:
5
6**การทำความสะอาดอินพุต:**
7อินพุตในโลกแห่งความเป็นจริงมักมีช่องว่าง เครื่องหมายยัติภังค์ หรืออักขระการจัดรูปแบบอื่นๆ (เช่น "4532-0151-1128-3036") ลบสิ่งเหล่านี้ออกก่อนการตรวจสอบแทนที่จะปฏิเสธอินพุต—ผู้ใช้มักคัดลอกหมายเลขที่มีการจัดรูปแบบ อย่างไรก็ตาม ให้ปฏิเสธอักขระตัวอักษรทันทีเนื่องจากบ่งชี้ว่าอินพุตไม่ถูกต้อง
8
9**เลขนำหน้ามีความสำคัญ:**
10หมายเลขเช่น "0123456789" แตกต่างจาก "123456789" สำหรับวัตถุประสงค์ของ Luhn เลขนำหน้าต้องถูกเก็บรักษาระหว่างการตรวจสอบ สิ่งนี้ทำให้นักพัฒนาสับสนที่แปลงเป็นจำนวนเต็มก่อน—ใช้การดำเนินการกับสตริงแทน
11
12**ขีดจำกัดของจำนวนเต็มในภาษา:**
13บัตรเครดิตโดยทั่วไปมีความยาวสูงสุด 19 หลัก ซึ่งพอดีกับจำนวนเต็ม 64 บิต แต่หากคุณกำลังตรวจสอบตัวระบุความยาวใดๆ ให้หลีกเลี่ยงการแปลงเป็นจำนวนเต็ย ประมวลผลเป็นสตริงหรืออาร์เรย์ของหลักเพื่อป้องกันการล้น
14
15**อินพุตว่างหรือเป็นค่านัล:**
16กำหนดพฤติกรรมของคุณอย่างชัดเจน: โยนข้อยกเว้น ส่งคืนเท็จ หรือจัดการอย่างเหมาะสม? ฉันพบว่าการส่งคืนเท็จมีความหมายที่สุดสำหรับฟังก์ชันการตรวจสอบ แต่จุดสิ้นสุด API อาจต้องการส่งคืนข้อผิดพลาด 400 พร้อมข้อความอธิบาย
17
18**ประสิทธิภาพในระดับขนาดใหญ่:**
19สำหรับการตรวจสอบเป็นชุด (เช่น การประมวลผลไฟล์ CSV ที่อัปโหลดด้วยหมายเลขบัตรนับพัน) อัลกอริทึมพื้นฐานมีความเร็วค่อนข้างสูงแล้ว—O(n) โดยที่ n คือจำนวนหลัก คอขวดมักเป็นการรับส่งข้อมูล ไม่ใช่การคำนวณ มุ่งเน้นการปรับให้เหมาะสมที่การแยกวิเคราะห์ไฟล์และการรายงานข้อผิดพลาดมากกว่าตรรกะการตรวจสอบเอง
20
21## การอ้างอิงอย่างรวดเร็ว: หมายเลขทดสอบ
22
23ใช้เหล่านี้สำหรับการทดสอบการใช้งานของคุณ:
24
25**หมายเลขที่ถูกต้อง:**
26- `4532015112830366` — รูปแบบ Visa (16 หลัก)
27- `046454286` — รูปแบบ SIN ของแคนาดา (9 หลัก)
28- `79927398713` — หมายเลขทั่วไปที่ถูกต้อง
29
30**หมายเลขที่ไม่ถูกต้อง:**
31- `4532015112830367` — คลาดเคลื่อนไปหนึ่งหลัก
32- `490154203237518` — หลักตรวจสอบผิด
33- `79927398714` — หลักสุดท้ายไม่ถูกต้อง
34
35กรณีทดสอบเหล่านี้ครอบคลุมสถานการณ์ทั่วไป: หมายเลขมาตรฐานที่ถูกต้อง ข้อผิดพลาดหนึ่งหลัก และหลักตรวจสอบที่ไม่ถูกต้อง
36
37## ชุดทดสอบอัตโนมัติ
38
39นี่คือชุดทดสอบที่ครอบคลุมเพื่อตรวจสอบการใช้งานของคุณ:
40
41

python def test_luhn_algorithm(): # การทดสอบการตรวจสอบพื้นฐาน assert luhn_validate(4532015112830366) == True assert luhn_validate(4532015112830367) == False assert luhn_validate(79927398713) == True assert luhn_validate(79927398714) == False

# ทดสอบหมายเลขที่สร้างขึ้นจริงผ่านการตรวจสอบ
for _ in range(10):
    generated = generate_valid_number(16)
    assert luhn_validate(generated) == True, f"การสร้าง {generated} ล้มเหลว"

# กรณีขอบเขต: หลักเดียว
assert luhn_validate(0) == True  # 0 mod 10 = 0

# กรณีขอบเขต: การคงไว้ของเลขศูนย์นำหน้า
assert luhn_validate("0000000000000000") != luhn_validate(0)

print("การทดสอบทั้งหมดผ่าน!")

test_luhn_algorithm()


## คำถามที่พบบ่อย

### อัลกอริทึมลูห์นใช้ทำอะไร?

อัลกอริทึมลูห์นใช้ตรวจสอบหมายเลขประจำตัวต่างๆ รวมถึงบัตรเครดิต (Visa, Mastercard, Amex) หมายเลข IMEI ของอุปกรณ์มือถือ หมายเลขประกันสังคมของแคนาดา และหมายเลข NPI ของการดูแลสุขภาพในสหรัฐฯ มันสามารถจับข้อผิดพลาดทั่วไปจากการป้อนข้อมูล เช่น การพิมพ์ตัวเลขผิดหรือสลับตัวเลขโดยไม่ตั้งใจ ก่อนที่จะทำให้เกิดข้อผิดพลาดในการประมวลผลหรือการทำธุรกรรมล้มเหลว

### อัลกอริทึมลูห์นมีความแม่นยำในการตรวจจับข้อผิดพลาดมากน้อยเพียงใด?

ลูห์นสามารถจับข้อผิดพลาดตัวเลขเดี่ยวได้ประมาณ 98% และข้อผิดพลาดการสลับตัวเลขที่อยู่ติดกันได้ประมาณ 90% (เช่น พิมพ์ "12" แทน "21") อย่างไรก็ตาม มันจะพลาดข้อผิดพลาดแฝดที่ตัวเลขเหมือนกัน (22→55) และการสลับตัวเลขกระโดด (101→404) สำหรับการใช้งานส่วนใหญ่ที่เกี่ยวข้องกับการป้อนข้อมูลด้วยตนเอง อัตราการตรวจจับนี้ถือว่าเพียงพอ

### ฉันสามารถตรวจสอบบัตรเครดิตแบบออฟไลน์ด้วยอัลกอริทึมลูห์นได้หรือไม่?

ได้ การตรวจสอบลูห์นทำงานแบบออฟไลน์อย่างสมบูรณ์ - เป็นคณิตศาสตร์บริสุทธิ์ที่ไม่ต้องค้นหาฐานข้อมูลหรือเรียก API ซึ่งทำให้เหมาะสำหรับการตรวจสอบฝั่งไคลเอ็นต์ในแบบฟอร์มเว็บ ลดภาระเซิร์ฟเวอร์และให้ข้อมูลป้อนกลับแก่ผู้ใช้ทันที แต่โปรดจำไว้ว่าหมายเลขที่ผ่านลูห์นไม่ได้หมายความว่าบัตรนั้นใช้งานได้หรือมีเครดิตคงเหลือ

### อัลกอริทึมลูห์นปลอดภัยสำหรับการชำระเงินหรือไม่?

ไม่ - ลูห์นเป็นเพียงการตรวจจับข้อผิดพลาด ไม่ใช่ความปลอดภัย มันเพียงตรวจสอบรูปแบบทางคณิตศาสตร์เท่านั้น การผ่านการตรวจสอบลูห์นไม่ได้ยืนยันว่าบัตรนั้นมีอยู่จริง ใช้งานได้ มีเงิน หรือเป็นของผู้ใช้ ความปลอดภัยการชำระเงินสมัยใหม่ต้องการหลายชั้น: การตรวจสอบ CVV/CVC, การตรวจสอบที่อยู่ (AVS), การรับรองความถูกต้อง 3D Secure และการสร้างโทเค็น ลูห์นเป็นเพียงการตรวจสอบเบื้องต้นเท่านั้น

### ภาษาโปรแกรมมิ่งใดบ้างที่รองรับการใช้งานลูห์น?

ทุกภาษาโปรแกรมทั่วไปสามารถใช้ลูห์นได้ - เป็นอัลกอริทึมง่ายที่ต้องการเพียงการคำนวณและลูปพื้นฐาน Python, JavaScript, Java, C++, C#, PHP, Ruby, Go, Rust และ Swift สามารถจัดการได้อย่างง่ายดายใน 10-20 บรรทัดของโค้ด บางภาษามีไลบรารีของบุคคลที่สาม แต่อัลกอริทึมนี้เรียบง่ายพอที่นักพัฒนาส่วนใหญ่จะสามารถเขียนได้โดยตรง

### ทำไมจึงเรียกว่าอัลกอริทึมโมด 10?

ขั้นตอนสุดท้ายตรวจสอบว่าผลรวมของตัวเลขหารด้วย 10 ลงตัวหรือไม่ โดยใช้การดำเนินการโมดุโล (sum % 10 == 0) "โมด 10" อ้างอิงถึงการตรวจสอบโมดุโล 10 นี้ หากเศษเหลือเป็นศูนย์เมื่อหารด้วย 10 หมายเลขนั้นจะผ่าน มิฉะนั้นจะล้มเหลว คุณสมบัติทางคณิตศาสตร์นี้คือสิ่งที่ทำให้อัลกอริทึมทำงาน

### ฉันสามารถสร้างหมายเลขบัตรเครดิตทดสอบด้วยลูห์นได้หรือไม่?

ได้ - คุณสามารถสร้างหมายเลขที่ผ่านการตรวจสอบลูห์นเพื่อทดสอบแบบฟอร์มการชำระเงินระหว่างการพัฒนา หมายเลขเหล่านี้ไม่ใช่บัตรจริงที่ใช้งานได้ แต่เพียงตรงตามรูปแบบทางคณิตศาสตร์ ซึ่งถือเป็นสิ่งถูกกฎหมายและจำเป็นสำหรับการทดสอบ แต่การพยายามใช้หมายเลขที่สร้างขึ้นเพื่อการซื้อจริงถือเป็นการฉ้อโกง เกตเวย์การชำระเงินส่วนใหญ่มีหมายเลขบัตรทดสอบอย่างเป็นทางการสำหรับสภาพแวดล้อมการทดสอบ

### ข้อจำกัดของอัลกอริทึมลูห์นคืออะไร?

ลูห์นจะไม่สามารถจับข้อผิดพลาดเหล่านี้ได้: ข้อผิดพลาดแฝด (22↔55), การสลับตัวเลขกระโดด (101↔404), ข้อผิดพลาดทางเสียง (60↔06 ในบางกรณี) หรือข้อผิดพลาดหลายอย่างพร้อมกัน นอกจากนี้ยังไม่มีความปลอดภัยทางการเข้ารหัส - รูปแบบที่ถูกต้องไม่ได้หมายความว่าบัตรถูกต้อง แม้มีข้อจำกัดเหล่านี้ แต่ความเรียบง่ายและอัตราการตรวจจับข้อผิดพลาดมากกว่า 90% ทำให้มันเป็นประโยชน์สำหรับระบบการชำระเงินในโลกแห่งความเป็นจริงเมื่อใช้ร่วมกับวิธีการตรวจสอบอื่นๆ

## เริ่มตรวจสอบหมายเลข

ใช้เครื่องคำนวณด้านบนเพื่อตรวจสอบหมายเลขบัตรเครดิต สร้างข้อมูลทดสอบสำหรับสภาพแวดล้อมการพัฒนา หรือสำรวจวิธีที่อัลกอริทึมโมด 10 ประมวลผลแต่ละหลัก การแสดงภาพทีละขั้นตอนช่วยแก้ไขปัญหาการใช้งานและอธิบายผลการตรวจสอบให้กับผู้มีส่วนได้ส่วนเสียที่ไม่มีความรู้ทางเทคนิค

ไม่ว่าคุณกำลังสร้างแบบฟอร์มการชำระเงิน แก้ไขปัญหาระบบตรวจสอบ IMEI หรือเพียงแค่เรียนรู้เกี่ยวกับอัลกอริทึมการตรวจสอบ เครื่องมือนี้ให้ข้อมูลป้อนกลับแบบทันทีและความโปร่งใสทางเทคนิคที่คุณต้องการ

## การอ้างอิงและการอ่านเพิ่มเติม

1. [Luhn, H. P. (1960). "คอมพิวเตอร์สำหรับการตรวจสอบตัวเลข". สิทธิบัตรสหรัฐ 2,950,048](https://patents.google.com/patent/US2950048) - สิทธิบัตรดั้งเดิมที่อธิบายอัลกอริทึม

2. [ISO/IEC 7812-1:2017 - บัตรประจำตัว](https://www.iso.org/standard/70484.html) - มาตรฐานสากลสำหรับระบบการกำหนดหมายเลขบัตร ซึ่งระบุการใช้งาน Luhn สำหรับบัตรชำระเงิน

3. [Gallian, Joseph (1991). "คณิตศาสตร์ของหมายเลขประจำตัว"](https://www.jstor.org/stable/2686878) - การวิเคราะห์ทางวิชาการของอัลกอริทึมการตรวจสอบหลักต่าง ๆ รวมถึง Luhn ซึ่งตีพิมพ์ใน The College Mathematics Journal

4. [มาตรฐานความปลอดภัยข้อมูลอุตสาหกรรมบัตรชำระเงิน (PCI DSS)](https://www.pcisecuritystandards.org/) - มาตรฐานความปลอดภัยที่กำกับดูแลวิธีการจัดการข้อมูลบัตรชำระเงิน โดยให้บริบทว่า Luhn มีส่วนอย่างไรในชั้นความปลอดภัย