אלגוריתם לחישוב תעודת זהות

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

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

אני אוסיף את תאור האלגוריתם כאן בפוסט וכן דוגמאות ב3 שפות שונות (פרל, רובי ופסקל).

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

האלגוריתם:

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

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

כלומר אם מספר התעודת זהות שקיבלנו הוא 1234 אנחנו נהיה צריכים להוסיף לו עוד 4 אפסים לפני הסיפרה 1 ונקבל את המספר 00001234.

יצירת סיפרת ביקורת:

בשביל לייצר את ספרת הביקורת נכתוב תחת כל ספרה ב8 הספרות שלנו או את הספרה 1 או את הספרה 2 בהתאם לסדר. כלומר למספר תעודת הזהות 12345678 ניצור את החישוב הבא:

12345678
12121212

עכשיו נכפיל כל ספרה של תעודת הזהות בספרה שרשמנו תחתיתה, כלומר: 1 כפול 1, 2 כפול 2, 3 כפול 1 וכו'…

במידה וקיבלנו ערך שהוא יותר גדול מ9 בכפל שלנו, נחבר את 2 הספרות אחת עם השנייה, כלומר נגיד ויש לנו את הספרה 12 מ6 כפול 2, אז נעשה 1+2 על המספר 12. אותו הדבר על 16 (כלומר 8 כפול 2), נקבל את הספרה 7 מהתוצאה של 16.

לאחר מכן, נחבר את התוצאה שלנו:

12345678
12121212
1+4+3+8+5+1+2+7+1+6 = 38

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

ווידוא תקינות של מספר תעודת הזהות:

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

123456782
121212121

ואז נבצע את החישוב בשנית, כלומר 1 כפול 1, 2 כפול 2, 3 כפול 1 וכו'. ונחבר את כל הספרות שנקבל בשנית.

כלומר:

123456782
121212121
1+4+3+8+5+1+2+7+1+6+2 = 40

אנחנו אמורים לקבל ספרה שמתחלקת ב10.

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

קוד לבדיקת תקינות ספרת הביקורת :

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

פרל:

1 sub validateIDNumber
2 {
3   my $id_num       = shift or return 0;
4   my @id_12_digits = (1, 2, 1, 2, 1, 2, 1, 2, 1);
5   $id_num          = '0' x (9 - length($id_num)) . $id_num;
6   my @id           = split //, $id_num;
7   my $result       = 0;
8   for (my $i=0; $i < 9; $i++)
9    {
10     my $num = int($id[$i] * $id_12_digits[$i]);
11     $num = int($num / 10) + int($num % 10) if ($num >= 10);
12     $result += $num;
13   }
14   return (0 == $result % 10)
15 }

רובי:

1 def validateIDNumber(aId)
2   id_12_digits = [1, 2, 1, 2, 1, 2, 1, 2, 1]
3   id_num       = aId.to_s
4   id_num       = '0' * (9 - id_num.to_s.length ) + id_num
5
6   result       = 0
7   for i in 0..8
8     num     = id_num[i,1].to_i * id_12_digits[i].to_i
9     num     = (num / 10) + (num % 10) if (num >= 10)
10    result += num
11  end
12
13  return (result % 10  == 0)
14 end

פסקל:

1 uses StrUtils; //...
2 function ValidateIDNumber ( const aID : String ) : Boolean;
3 const MAX_FULL_ID_DIGITS = 9;
4  id_12_digits : array[1..MAX_FULL_ID_DIGITS] of Byte = (1, 2, 1, 2, 1, 2, 1, 2, 1);
5
6 var ID             : String;
7     num, return, i : Byte;
8
9 begin
10   if Trim(aID) = '' then Exit(False);
11   ID     := aID;
12   ID     := AddChar('0', ID, MAX_FULL_ID_DIGITS);
13   return := 0;
14
15   for i := 1 to MAX_FULL_ID_DIGITS do
16     begin
17       num := StrToInt(ID[i]) * id_12_digits[i];
18       if num > 9 then num := (num div 10) + (num mod 10);
19       inc(return, num);
20     end;
21
22   ValidateIDNumber := (return mod 10 = 0);
23 end;

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

7 מחשבות על “אלגוריתם לחישוב תעודת זהות

  1. Shai

    אני די בטוח שאלגוריתם הבדיקה שלך נכון; אני גם די בטוח שאלגוריתם הייצור לא נכון.

    תנסה למשל עם שמונה הספרות 02345678 (רק החלפתי את ה-1 בהתחלה ל-0). סכום הספרות יוצא כמובן 1 פחות, כלומר 37, ולפי אלגוריתם הייצור שלך זה נותן ספרת ביקורת 1 (3+7=10, 1+0). אבל אז בבדיקה מקבלים 38 שהוא לא עגול.

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

  2. ik_5 מאת

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

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

  3. פינגבק: חישוב תקינות תעודת זהות - #c « The Yakov Blog

  4. queency
    #!/usr/bin/env python
    #-*- coding: utf-8 -*-
    
    import sys
    
    if __name__ == '__main__':
       arg1str=str(sys.argv[1])
       if len(arg1str)9: tempNum=tempNum/10+tempNum%10
             #print arg1str[enum],pattern[enum],tempNum #for debugging only
             summ+=tempNum
    
          if summ%10==0: outStr = outStr + " - OK"
          else: outStr=outStr+" - NOT OK"
          print outStr
       else:
          print "too much digits (max 9 allowed) or argument not digit"
    
  5. יצחק הראל

    הנה קוד בPHP
    function validate_id($id)
    {
    if (strlen($id)verbose("$id\n");
    $machanizem_array=str_split($machanizem);

    if (strlen($id)=2)
    {
    $leading_zero=(9-strlen($id));

    for ($j=0;$jverbose("ID NOW: $id !!");
    }

    $id_array=str_split($id);

    for ($i=0;$i<9;$i++)
    {
    $multipal=intval($id_array[$i])*intval($machanizem_array[$i]);
    $sum+=(intval(($multipal)/10)+($multipal%10));
    }

    if (($sum%10)!=0)
    return false;

    else return true;
    }

כתיבת תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s