כתבתי בעבר על זה שיצרתי מחדש פונקציות שמחשבות האם המספר המלא של תעודת הזהות שהוזן הוא תקין או לא.
אני רואה שהרבה אנשים מחפשים פיזית את האלגוריתם לכך (עוד יותר, את הקוד).
אני אוסיף את תאור האלגוריתם כאן בפוסט וכן דוגמאות ב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;
זכרו המידע והקוד מסופק כאן ללא אחריות והשימוש בו הוא על אחריותכם בלבד.
אני די בטוח שאלגוריתם הבדיקה שלך נכון; אני גם די בטוח שאלגוריתם הייצור לא נכון.
תנסה למשל עם שמונה הספרות 02345678 (רק החלפתי את ה-1 בהתחלה ל-0). סכום הספרות יוצא כמובן 1 פחות, כלומר 37, ולפי אלגוריתם הייצור שלך זה נותן ספרת ביקורת 1 (3+7=10, 1+0). אבל אז בבדיקה מקבלים 38 שהוא לא עגול.
אלגוריתם הייצור צריך לשקף את הבדיקה: סכום ספרות כמוסבר לעיל, והשלם לעגול.
יש דרך מאוד פשוטה לבדוק האם אלגוריתם הזה נכון. תנסה על מספר תעודת זהות קיים ותראה האם האלגוריתם מספק לך את מספק הביקורת הנכון. אם כן, אז סימן שהוא נכון.
שים לב שלא כל מספר יכול להיות תעודת זהות אמיתית. אם היית מוסיף עוד ספרה אחת ואז ספרת ביקורת היה לך הרבה יותר מספרים שכן היית יכול להשתשמ בהם.
אם מספר תעודת הזהות האמיתי נכון, כנראה ויש לנו פונקציה נוספת שלא מימשת שמופיעה בשלב חילול המספר.
אוקי, אכן היתה בעיה באלגוריתם ותיקנתי אותו. תודה 🙂
פינגבק: חישוב תקינות תעודת זהות - #c « The Yakov Blog
הנה קוד ב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;
}
פינגבק: כיצד לבדוק בקלות תקינות של מספרי תעודות זהות על ידי אקסל – אקסל מאסטר
קוד בkotlin
fun idVerification(id: String): Boolean {
if (!TextUtils.isEmpty(id)) {
if (id.length in 8..9) {
var idNumber = id.toInt()
val idArray: ArrayList = ArrayList()
PYTHON
sum(sum(map(int, str(int(a)*(i%2+1)))) for i, a in enumerate(‘{0:09d}’.format(int(t)))) % 10 == 0
sum(sum(map(int, str(int(a) * (i % 2 + 1)))) for i, a in enumerate(e_id, 0)) % 10 == 0
C/C++/JAVA/C#
bool checkID(int id)
{
int sum = 0;
bool odd = true;
int temp = 0;
}
Python 3
סקריפט לבדיקת תקינות ספרת הביקורת בתעודת הזהות (פייתון 3). אם המספר קטן מ-9 ספרות, הסקריפט יחזיר מספר בן 9 ספרות כולל את ספרת הביקורת הנכונה, לצד אפסים משמאל.
while True:
id = input("Enter ID No: ('end' to exit) ")
if id == "end":
exit()
if id.isdigit() == False:
print("ID has only digits")
continue
if len(id) > 9:
print(id, "has more than 9 digits")
continue
if len(id) == 9:
lst_id = list(map(int, id))
lst_id[1::2] = map(lambda x: x * 2, lst_id[1::2])
lst_id = map(lambda x: (x % 10 + x // 10), lst_id)
num1 = sum(lst_id)
if num1 % 10 != 0:
print("Your ID is wrong")
else:
print("ID is correct")
continue
while len(id) < 8:
id = "0" + id
lst_id = list(map(int, id))
lst_id[1::2] = map(lambda x : x * 2, lst_id[1::2])
lst_id = map(lambda x : (x % 10 + x // 10), lst_id)
num1 = sum(lst_id)
digit9 = 0 if num1 % 10 == 0 else 10 – num1 % 10
new_id = id + str(digit9)
print("Your ID is:", new_id)
האם מישהו יודע כיצד אוכל לממש את הבדיקה הזו ב- google forms? תודה.
איך אוכל לבצע את הסיקה ב java? (באפליקציה)