תפריט

אלגוריתמי ספרת ביקורת: mod-10, mod-11 ו-mod-97 בהשוואה

לאלגוריתמי ספרת ביקורת יש שלד אחד משותף — שקלול הספרות, חיבור, חלוקה במודולוס והמרת השארית. משפחות mod-10, mod-11 ו-mod-97 נבדלות רק בפרמטרים האלה.

פורסם

  • אימות
  • ספרת ביקורת
  • אלגוריתמים

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

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

מהן המשפחות העיקריות של אלגוריתמי ספרת ביקורת?

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

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

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

איך נבדלים mod-10, mod-11 ו-mod-97

ההבדלים שמשנים בפועל הם כולם תוצאה של המודולוס.

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

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

משקלים ומודולוס: הפרמטרים שבתוך משפחה

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

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

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

מדוע חלק מהאלגוריתמים תופסים שגיאות היפוך?

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

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

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

ארבע שאלות לשאול לפני בחירת אלגוריתם

הבחירה נעשית קלה יותר כשהיא מנוסחת כקבוצה קצרה של שאלות קונקרטיות ולא כעניין של העדפה.

  1. כמה ארוך יכול להיות המזהה, והאם האורך קבוע או משתנה?
  2. אילו תווים חוקיים—ספרות בלבד, או גם אותיות?
  3. האם השגיאות הצפויות מגיעות מאנשים שמקלידים, ממכונות שמייצרות, או משניהם?
  4. מה קורה כשהחשבון מייצר תו ביקורת שאינו נכנס לתבנית?

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

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

למפתחים: מימוש אחד לכל המשפחה

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

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

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

צעדים הבאים

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

המשך קריאה

מדריכים בנושא כלי אימות למספרי כרטיסים ולמספרי זהות