ישראל ישראלי, זה אתה?

לכולנו (אני ממש מקווה) יש מספר תעודת זהות בן 9 ספרות. 

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

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

 

 

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

 

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

 

העתקה מויקי לקיצור תהליכים: מספר הזהות בישראל מורכב מתשע ספרות, שהימנית שבהן היא ספרת הביקורת. לכל אחת משמונה הספרות שמשמאל ניתן משקל: 1 (לספרה ראשונה), 2, 1, 2, 1, 2, 1, 2.

כל ספרה מוכפלת במשקל שלה, וכל הספרות של התוצאות מחוברות יחדיו. אם התוצאה של הכפלת הספרה במשקלה היא בת שתי ספרות, מסוכמת כל אחת משתי הספרות של התוצאה (כלומר המספר הדו-ספרתי מופרד לשני מספרים בעלי ספרה אחת, המחוברות לכל יתר הספרות). את הסכום המתקבל יש להשלים לכפולה הקרובה של 10 (כלפי מעלה. לדוגמה: אם הסכום שהתקבל הוא 32, ההשלמה תהיה 8). ההפרש שאותו נדרש להשלים הוא ספרת הביקורת.

 

דוגמה: מספר הזהות הוא 54370042-1. מכפלות שמונה ספרותיו השמאליות של מספר זה במשקלות שלהן הן:

5×1 = 5, 4×2 = 8, 3 ×1 = 3, 7×2 = 14, 0×1 = 0 ,0 ×2 = 0, 4 ×1 = 4, 2 ×2 = 4

 

סכום ספרותיהן (יש לשים לב – מחברים את הספרות ולא את המספרים) הוא 29 =4 + 4 + 0 + 0 + (1+4) + 3 + 8 + 5 ולכן ספרת הביקורת היא 1 (המשלים של 29 ל-30)

 

 

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

אחרי המידע הזה שיש לנו לגבי מספרי תועדת זהות, בואו נחשוב הפוך.

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

זה נראה משהו כזה:

 

const makeId = (id) => {

 id = id.length < 8 ? ("0000000" + id).slice(-8) : id;

 const amount = Array.from(id, Number).reduce((counter, digit, i) => { const step = digit * ((i % 2) + 1);

 return counter + (step >= 9 ? step - 9 : step);

 }, 0);

 return id + (amount % 10 === 0 ? 0 : 10 - (amount % 10)).toString();

};

 

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

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

 

const fs = require("fs");

const  logger = fs.createWriteStream("log.txt", {

  flags: "a",

});

for (let index = 1000000; index < 1000300; index++) {

  const id = makeId(index.toString()) + "\n";

  logger.write(id);

}

logger.end();

וככה יש לנו קובץ מכיל מספרי תעודת זהות!

 

 

 

 

המאמר לקוח מהבלוג  run dev

להצטרפות לרשימת תפוצה https://bit.ly/run-dev