דלג לתוכן

מחשבון אלגוריתם לון - אימות כרטיסי אשראי ו-IMEI

מחשבון אלגוריתם לון החינמי מאמת מספרי כרטיסי אשראי, IMEI ומספרי זהות לפי ספרת הביקורת mod 10. ניתן גם ליצור מספרי בדיקה תקינים לפיתוח ולבדיקות תוכנה.

מחשבון אלגוריתם לון

פעולה

בדוק אם המספר שלך עובר את אימות לון מודולו 10

מחשבון טעינה...
📚

תיעוד

הבנת אלגוריתם לוהן

צריך לאמת מספר כרטיס אשראי או לתקף מספר IMEI? אלגוריתם לוהן (או "אלגוריתם מודולו 10") הוא נוסחת checksum שהיתה עמוד השדרה של אימות תשלומים מאז 1954. המדען של IBM, הנס פטר לוהן, תכנן בדיקה מתמטית מομחשת זו כדי לתפוס שגיאות הקלדה ושיבושי העתקה שמאפיינים הזנת נתונים ידנית - כמו כאשר אתה מחליף בטעות שני ספרות או מקליד מספר שגוי.

זה מה שהופך אותו לבלתי מחליף: כל רשת כרטיסי אשראי מרכזית (ויזה, מאסטרקארד, אמריקן אקספרס), מספרי IMEI של מכשירים ניידים, מספרי ביטוח סוציאלי קנדיים, ומזהי ספקי בריאות אמריקאים נשענים על אלגוריתם זה. כאשר אתה מקליד מספר כרטיס בטופס תשלום והוא דוחה מיידית שגיאה, זהו בדיקת לוהן בפעולה.

מחשבון זה מאפשר לך לאמת כל רצף מספרים או ליצור נתוני בדיקה שעוברים אימות - חיוני כאשר אתה בונה אינטגרציות תשלום או בודק מערכות זיהוי ללא שימוש בנתוני לקוחות אמיתיים.

כיצד להשתמש במחשבון זה

אימות מספרים קיימים: הזן רצף מספרים כלשהו - כמו כרטיס אשראי בן 16 ספרות או IMEI בן 15 ספרות - ולחץ על "אמת". תראה מיד אם הוא עובר את בדיקת המודולו 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 הוא פעולת המודולו.

יישומים בעולם האמיתי

עיבוד תשלומים: כל רשת כרטיסים מרכזית—ויזה, מאסטרקארד, אמריקן אקספרס, דיסקובר—משתמשת בבדיקת לוהן כהגנה ראשונית מפני שגיאות הקלדה. בעת בניית טופס תשלום, יישום אימות לוהן בצד הלקוח חוסך מהמשתמשים להגיש מספרים שגויים באופן ברור ומפחית קריאות API מיותרות לשערי תשלום.

מעקב אחר מכשירים ניידים: מספרי IMEI בטלפונים וטאבלטים כוללים ספרת בדיקה של לוהן. זה הופך קריטי בניהול שרשרת אספקה ומערכות אימות מכשירים—ראיתי מערכות מחסן דוחות סריקות IMEI לא תקינות מיידית, מונעות שגיאות משלוח לפני שהן מתרחשות.

מזהי שירותי בריאות: מערכת המזהה הלאומית של ספקי שירות (NPI) בארה"ב מאמתת מספרי ספקים באמצעות אלגוריתם זה. עם מיליוני עסקאות בריאות יומיומיות, זיהוי שגיאות העתקה במזהי ספקים מונע עיכובי חיוב ומפחית דחיות תביעות.

זיהוי ממשלתי: מספרי ביטוח סוציאלי קנדיים כוללים אימות לוהן. האלגוריתם מספק בדיקת הגיון מהירה ללא צורך בחיפוש במסד נתונים, מה שהופך אותו ליעיל בתרחישי אימות בנפח גבוה.

מערכות ספרים מסורתיות: חלק מיישומי ISBN-10 משתמשים בגרסת לוהן. בעוד ISBN-13 משתמש באלגוריתם ספרת בדיקה שונה, מערכות ספריות ומלאי ישנות עדיין מסתמכות על אימות מבוסס לוהן.

דוגמאות שלב אחר שלב

אימות מספר כרטיס אשראי

בואו נאמת את המספר 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. זהו בדיוק האופן שבו האלגוריתם מזהה שגיאות העתקה במזהי התקנים.

אלגוריתמי בדיקת סכום חלופיים

אלגוריתם לון פופולרי כי הוא פשוט ליישום, אך קיימים חלופות מתוחכמות יותר כאשר נדרשת זיהוי שגיאות חזק יותר:

אלגוריתם ורהוף: מזהה את כל השגיאות בספרה בודדת וכמעט את כל שגיאות החלפת מיקום, כולל מקרי ספרות תאומות שלון מחמיץ (כמו 22↔55). התמורה היא מורכבות גבוהה יותר - הוא דורש טבלאות חיפוש עם פעולות כפל והחלפה. השתמש בזה כאשר דיוק הנתונים קריטי ועומס חישובי אינו מהווה בעיה.

אלגוריתם דאם: מזהה את כל השגיאות בספרה בודדת וכל החלפות סמוכות ללא יוצא מן הכלל. הוא מבוסס על פעולת קבוצה-כמעט מיוחדת המבטיחה כיסוי מלא. היישום משתמש בטבלת חיפוש אחת, מה שהופך אותו פשוט יותר מורהוף אך עדיין מורכב יותר מלון.

ספרת בדיקה ISBN-13: משתמש באלגוריתם משקולות מודולו 10 השונה מלון ו-ISBN-10. המשקולות מתחלפות בין 1 ל-3, מה שמספק זיהוי שגיאות טוב עבור מזהי ספרים באופן ספציפי. זה החליף את מערכת ISBN-10 הישנה (שהשתמשה בלון) כאשר התעשייה נזקקה למרחב מזהים גדול יותר.

היסטוריה והקשר

האנס פטר לון פיתח אלגוריתם זה ב-IBM בשנת 1954, בימיה הראשונים של עיבוד נתונים אוטומטי. לון היה כבר ידוע בעבודת חלוץ בחיפוש מידע - מערכת האינדקסציה KWIC (מילת מפתח בהקשר) שלו השפיעה על אופן החיפוש במסמכים גם כיום - אך אלגוריתם המודולו 10 הפך לתרומתו המשמעותית ביותר.

הנה ההבחנה המכרעת: לון תכנן זאת עבור גילוי שגיאות, לא אבטחה. בשנות ה-50, הבעיה הייתה שגיאות בכרטיסי נקב וטעויות העתקה ידניות, לא הונאה דיגיטלית. האלגוריתם תופס שגיאות אקראיות בצורה מבריקה - אך זו לא קריפטוגרפיה. מספר לון תקף לא אומר שהכרטיס פעיל, ממומן, או שייך לאדם המשתמש בו.

מה שמרשים הוא כמה אלגוריתם בן 70 שנה עדיין משרת את מטרתו המקורית. מעבדי תשלומים מוסיפים עליו אבטחה מודרנית (טוקניזציה, אימות CVV, 3D Secure), אך בדיקת לון הראשונית בצד הלקוח עדיין עוצרת מיליוני שגיאות ברורות מדי לפני שהן מבזבזות רוחב פס בקריאות לשער תשלום.

דוגמאות יישום

להלן כיצד לממש אימות ויצירת מספר לוהן ב-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
21## דוגמה לשימוש:
22
23print(luhn_validate(4532015112830366))  # True
24print(luhn_validate(4532015112830367))  # False
25print(generate_valid_number(16))  # יוצר מספר תקף באורך 16 ספרות
26

מקרי קצה ותקלות יישום

בעת יישום אימות Luhn במערכות ייצור, שימו לב למספר בעיות נפוצות:

סינון קלט: קלט מהעולם האמיתי לעתים קרובות כולל רווחים, מקפים או תווים מעצבים אחרים (כמו "4532-0151-1128-3036"). הסירו אותם לפני האימות במקום לדחות את הקלט—משתמשים לעתים קרובות מעתיקים מספרים מעוצבים. עם זאת, דחו תווים אלפביתיים מיד מכיוון שהם מצביעים על קלט לא תקף.

אפסים מובילים חשובים: מספר כמו "0123456789" שונה מ-"123456789" לצורכי Luhn. אפסים מובילים חייבים להישמר במהלך האימות. זה מבלבל מפתחים שממירים תחילה למספרים שלמים—השתמשו בפעולות מחרוזת במקום זאת.

גבולות שלמים בשפה: כרטיסי אשראי בדרך כלל מגיעים עד 19 ספרות, המתאימים למספר שלם בגודל 64 סיביות. אך אם אתם מאמתים מזהים באורך שרירותי, הימנעו מהמרה למספרים שלמים כלל. עבדו כמחרוזות או מערכי ספרות למניעת גלישה.

קלט ריק או null: הגדירו את ההתנהגות שלכם באופן מפורש: זרקו חריגה, החזירו false, או טפלו בצורה מסודרת? מצאתי שהחזרת false הגיונית ביותר עבור פונקציות אימות, אך נקודות קצה של API עשויות לרצות להחזיר שגיאה 400 עם הודעה מתארת.

ביצועים בקנה מידה: עבור אימות אצווה (כמו עיבוד קבצי CSV עם אלפי מספרי כרטיסים), האלגוריתם הבסיסי כבר מהיר למדי—O(n) כאשר n הוא מספר הספרות. צוואר הבקבוק הוא בדרך כלל קלט/פלט, לא חישוב. התמקדו באופטימיזציה של ניתוח קובץ ודיווח שגיאות במקום בהיגיון האימות עצמו.

מדריך מהיר: מספרי בדיקה

השתמש באלה לבדיקת היישום שלך:

מספרים תקפים:

  • 4532015112830366 — פורמט Visa (16 ספרות)
  • 046454286 — פורמט SIN קנדי (9 ספרות)
  • 79927398713 — מספר תקף כללי

מספרים לא תקפים:

  • 4532015112830367 — שגוי בספרה אחת
  • 490154203237518 — ספרת בדיקה שגויה
  • 79927398714 — הספרה האחרונה שגויה

מקרי בדיקה אלה מכסים תרחישים נפוצים: מספרים תקפים סטנדרטיים, שגיאות בספרה אחת, וספרות בדיקה שגויות.

סוויטת בדיקות אוטומטית

להלן סוויטת בדיקות מקיפה לאימות היישום שלכם:

1def test_luhn_algorithm():
2    # בדיקות אימות בסיסיות
3    assert luhn_validate(4532015112830366) == True
4    assert luhn_validate(4532015112830367) == False
5    assert luhn_validate(79927398713) == True
6    assert luhn_validate(79927398714) == False
7
8    # בדיקת מספרים שנוצרו עוברים אימות
9    for _ in range(10):
10        generated = generate_valid_number(16)
11        assert luhn_validate(generated) == True, f"מספר שנוצר {generated} נכשל באימות"
12
13    # מקרה קצה: ספרה יחידה
14    assert luhn_validate(0) == True  # 0 mod 10 = 0
15
16    # מקרה קצה: אפס מוביל נשמר
17    assert luhn_validate("0000000000000000") != luhn_validate(0)
18
19    print("כל הבדיקות עברו!")
20
21test_luhn_algorithm()
22

שאלות נפוצות

למה משמש אלגוריתם לון?

אלגוריתם לון מאמת מספרי זיהוי כולל כרטיסי אשראי (ויזה, מאסטרקארד, אמקס), מספרי IMEI של מכשירים ניידים, מספרי ביטוח סוציאלי קנדיים ומספרי NPI של מערכת הבריאות האמריקאית. הוא מזהה טעויות נפוצות בהזנת נתונים - כמו ספרות שהוקלדו בטעות או מספרים שהוחלפו בטעות - לפני שהם גורמים לשגיאות בעיבוד או עסקאות כושלות.

עד כמה אלגוריתם לון מדויק בזיהוי שגיאות?

לון מזהה כ-98% משגיאות ספרה בודדת וכ-90% משגיאות החלפה סמוכות (כמו הקלדת "12" במקום "21"). עם זאת, הוא מחמיץ שגיאות תאומים שבהן שתי הספרות זהות (22→55) והחלפות קפיצה (101→404). עבור רוב היישומים המעשיים הכוללים הזנת נתונים ידנית, שיעור זיהוי זה מספק.

האם אני יכול לאמת כרטיסי אשראי באופן לא מקוון באמצעות אלגוריתם לון?

כן, אימות לון פועל לחלוטין באופן לא מקוון - זו מתמטיקה טהורה שאינה דורשת חיפוש במסד נתונים או קריאות API. זה הופך אותו מושלם לאימות בצד הלקוח בטפסי אינטרנט, מפחית עומס שרת ומספק משוב מיידי למשתמשים. אך זכור: מספר תקף בלון לא אומר שהכרטיס פעיל או שיש בו אשראי זמין.

האם אלגוריתם לון בטוח לעיבוד תשלומים?

לא - לון הוא זיהוי שגיאות, לא אבטחה. הוא מאמת רק פורמט מתמטי. בדיקת לון עוברת לא מאשרת שהכרטיס אמיתי, פעיל, ממומן או שייך למשתמש. אבטחת תשלומים מודרנית דורשת מספר שכבות: אימות CVV/CVC, אימות כתובת (AVS), אימות 3D Secure וטוקניזציה. לון הוא רק בדיקת סבירות ראשונית.

אילו שפות תכנות תומכות ביישום לון?

כל שפת תכנות כללית יכולה לממש את לון - זהו אלגוריתם פשוט הדורש רק חשבון אריתמטי בסיסי ולולאות. פייתון, JavaScript, Java, C++, C#, PHP, Ruby, Go, Rust ו-Swift יכולים לטפל בו בקלות ב-10-20 שורות קוד. בחלק מהשפות יש ספריות צד שלישי, אך האלגוריתם פשוט מספיק כך שרוב המפתחים מממשים אותו ישירות.

למה קוראים לו אלגוריתם מודולו 10?

השלב האחרון בודק אם סכום הספרות ניתן לחלוקה ב-10 באמצעות פעולת מודולו (sum % 10 == 0). "מודולו 10" מתייחס לבדיקת מודולו זו. אם השארית היא אפס בחלוקה ב-10, המספר עובר - אחרת הוא נכשל. תכונה מתמטית זו היא מה שהופך את האלגוריתם לפעיל.

האם אני יכול ליצור מספרי כרטיסי אשראי לבדיקה עם לון?

כן - אתה יכול ליצור מספרים שעוברים אימות לון לבדיקת טפסי תשלום בזמן פיתוח. אלה אינם כרטיסים אמיתיים ופעילים; הם רק מספקים פורמט מתמטי. זה חוקי והכרחי לבדיקה, אך ניסיון להשתמש במספרים שנוצרו לרכישות בפועל הוא הונאה. רוב שערי התשלום מציעים מספרי כרטיס בדיקה רשמיים לסביבות פיתוח.

מהן המגבלות של אלגוריתם לון?

לון לא יזהה: שגיאות תאומים (22↔55), החלפות קפיצה (101↔404), שגיאות פונטיות (60↔06 במקרים מסוימים), או שגיאות מרובות בו-זמניות. הוא גם לא מספק אבטחה קריפטוגרפית - פורמט תקף לא אומר כרטיס תקף. על אף מגבלות אלה, פשטותו ושיעור זיהוי השגיאות של מעל 90% הופכים אותו לפרקטי עבור מערכות תשלום בעולם האמיתי כאשר הוא משולב עם שיטות אימות אחרות.

התחל לאמת מספרים

השתמש במחשבון שלעיל כדי לאמת מספרי כרטיסי אשראי, ליצור נתוני בדיקה לסביבות פיתוח, או לחקור כיצד אלגוריתם המודולו 10 מעבד כל ספרה. החיזוי השלב-אחר-שלב מסייע בניפוי באגים ומסביר תוצאות אימות למעורבים שאינם טכניים.

בין אם אתה בונה טופס תשלום, מנפה באגים במערכת אימות IMEI, או רק לומד על אלגוריתמי checksum, כלי זה מספק משוב מיידי ושקיפות טכנית שאתה צריך.

מקורות וקריאה נוספת

  1. Luhn, H. P. (1960). "מחשב לאימות מספרים". פטנט ארה"ב 2,950,048 - הפטנט המקורי המתאר את האלגוריתם.

  2. ISO/IEC 7812-1:2017 - כרטיסי זיהוי - תקן בינלאומי למערכות מספור כרטיסי זיהוי, המפרט שימוש ב-Luhn עבור כרטיסי תשלום.

  3. Gallian, Joseph (1991). "המתמטיקה של מספרי זיהוי" - ניתוח אקדמי של אלגוריתמי ספרת בדיקה שונים כולל Luhn, שפורסם ב-The College Mathematics Journal.

  4. תקן אבטחת נתוני תעשיית כרטיסי תשלום (PCI DSS) - תקני אבטחה המסדירים כיצד יש לטפל בנתוני כרטיסי תשלום, המספקים הקשר למיקום Luhn במערך האבטחה.