มาดูวิธีเช็ค ว่า “เขามั่วรหัสประชาชนรึเปล่า?”

ขอเริ่มบทความแบบพิสดารบ้างได้ไหมครับ ก่อนอ่านบทความต่อไป ผมขอนำเสนอ หมอดูที่ชื่อว่า “แม่นมั่กๆ”

หมอดู แม่นมั่กๆ

หมอดู แม่นมั่กๆ สามารถทำนายรหัสประชาชนหลักที่ 13 จาก รหัสประชาชน 12 หลักแรกได้ครับ ไม่เชื่อก็ลอง คลิกที่นี่ แล้วกรอกรหัสประชาชน 12 หลักแรกดูครับ

โอ๊ะ ทำได้ไงเนี่ย อยากรู้หละสิ ถ้าอยากรู้มาลองอ่านบทความต่อสิครับ ^_^ รหัสประจำตัวประชาชน (ขอเรียกสั้นๆว่า รหัสประชาชน) ที่เราจะมาตรวจกันวันนี้เป็นรหัสประชาชน ของคนไทยนะครับ ก่อนอื่น ให้เพื่อนๆ หยิบบัตรประชาชนของเพื่อนๆ ขึ้นมาดูกันเลยครับ รหัสประจำตัวของเราจะอยู่ในรูป x-xxxx-xxxxx-xx-x (เลข 13 หลัก) ใช่มั้ยครับ แต่เพื่อนๆ รู้ป่ะว่า จริงๆแล้ว รหัสประจำตัวของเราเนี่ย จริงๆ แล้วมีแค่ 12 หลักเท่านั้น (12 หลักแรก) แต่เลขตัวสุดท้ายเนี่ย เป็น Check Digit ครับ

Check Digit คืออะไรหนอ?

Check Digit เป็นตัวเลข 1 หลัก ที่เกิดจากการนำเลขหลักอื่นๆ มา บวก ลบ คูณ หาร กัน และ Check Digit นี่หละครับ จะช่วยให้เราตรวจสอบในเบื้องต้นได้ว่า ข้อมูลที่กรอกมาถูกต้องรึเปล่า เวลาเราจะตรวจสอบว่าข้อมูลที่กรอกมาถูกต้องรึเปล่า เราจะคำนวณ Check Digit จากเลขหลักอื่นๆ เพื่อเปรียบเทียบกับ Check Digit ที่เขากรอกมาว่าตรงกันมั้ย ถ้าตรงกันก็แสดงว่าข้อมูลถูกต้องไม่ผิด ไม่มั่ว แต่ถ้าไม่ตรงกัน ก็แปลว่า ข้อมูลที่กรอกมามีข้อมูลซักหลัก หรือ สองหลักที่ผิด เราก็สามารถเตือนให้ผู้ใช้ทราบและกรอกใหม่ อีกครั้งได้

เอ้า มาลองคำนวณ Check Digit ของรหัสประชาชนเรากันดีกว่า

ขอยกตัวอย่างรหัสประชาชนนี้ละกันครับ 1-2015-41462-23-4 ไหน ตอบหน่อยซิ ว่า Check Digit ของรหัสประชาชนนี้คือเลขอะไรคร้าบ……. เอ้า ถามเองตอบเองก็ได้ Check Digit ของรหัสประชาชนนี้คือเลข 4 (เลขตัวสุดท้ายนั่นเอง) เรามาดูกันว่า เลข 4 เกิดจากอะไรหว่า? คำนวณมาได้ไง? มั่วอ๊ะเปล่า?

  • ขั้นตอนที่ 1 – เอาเลข 12 หลักมา เขียนแยกหลักกันก่อน (หลักที่ 13 ไม่ต้องเอามานะคร้าบ)
    1 2 0 1 5 4 1 4 6 2 2 3
  • ขั้นตอนที่ 2 – เอาเลข 12 หลักนั้นมา คูณเข้ากับเลขประจำหลักของมัน
    รหัสบัตร 1 2 0 1 5 4 1 4 6 2 2 3
    ตัวคูณ 13 12 11 10 9 8 7 6 5 4 3 2
    ผลคูณ 13 24 0 10 45 32 7 24 30 8 6 6
  • ขั้นตอนที่ 3 – เอาผลคูณทั้ง 12 ตัวมา บวกกันทั้งหมด จะได้ 13+24+0+10+45+32+7+24+30+8+6+6=205
  • ขั้นตอนที่ 4 – เอาเลขที่ได้จากขั้นตอนที่ 3 มา mod 11 (หารเอาเศษ) จะได้ 205 mod 11 = 7
  • ขั้นตอนที่ 5 – เอา 11 ตั้ง ลบออกด้วย เลขที่ได้จากขั้นตอนที่ 4 จะได้ 11-7 = 4 (เราจะได้ 4 เป็นเลขในหลัก Check Digit) ถ้าเกิด ลบแล้วได้ออกมาเป็นเลข 2 หลัก ให้เอาเลขในหลักหน่วยมาเป็น Check Digit (เช่น 11 ให้เอา 1 มา, 10 ให้เอา 0 มา เป็นต้น)

โอ้โห….มหัศจรรย์มาก ยอดเยี่ยมกระเทียมดอง เลขที่ได้ตรงกับเลขหลักที่ 13 ด้วยแหละ…ถ้าไม่เชื่อก็เอาเลขบัตรประชาชนตัวเองมาคำนวณดูสิครับ ผมคิดว่าหลายๆ คนคงมีคำถามในใจแล้วหละว่า ทำไมต้องเอามาคูณ 13 ทำไมต้องเอามา บวกกัน ทำไมต้องเอามา mod 11 คำตอบที่ผมให้ได้ก็คือ มันคือวิธีที่ถูกเลือกใช้ในการคำนวณ Check Digit ให้กับรหัสประชาชนครับ แต่ถ้าเราจะคำนวณ Check Digit ให้กับรหัสสินค้า หรือ ISBN ของหนังสือ เราก็ต้องใช้วิธีการคำนวณ ที่แตกต่างกันออกไปครับ

ในเมื่อรู้วิธีแล้ว เรามาเขียนโปรแกรมตรวจสอบกันดีกว่า

ผมเขียนไว้ให้หลายภาษาเหมือนกัน ให้เพื่อนๆ เลือกใช้ได้ตามสะดวกนะครับ

เวอร์ชัน JavaScript

function checkID(id) {
    if(id.length != 13) return false;
    for(i=0, sum=0; i < 12; i++)
        sum += parseFloat(id.charAt(i))*(13-i);
    if((11-sum%11)%10!=parseFloat(id.charAt(12)))
        return false;
    return true;
}
function checkForm() {
    if(!checkID(document.form1.txtID.value))
        alert('รหัสประชาชนไม่ถูกต้อง');
    else
        alert('รหัสประชาชนถูกต้อง เชิญผ่านได้');
}
<form name="form1">
<input type="text' name="txtID" id="txtID" />
<input type="button" onclick="checkForm()" />
</form>

เวอร์ชัน php

<?
function checkID($id) {
    if(strlen($id) != 13) return false;
    for($i=0, $sum=0; $i<12;$i++)
        $sum += (int)($id{$i})*(13-$i);
    if((11-($sum%11))%10 == (int)($id{12}))
        return true;
    return false;
}
?>
<form action="?" method="get">
รหัสประจำตัวประชาชน :
<input name="txtID" type="text" />
<input type="submit" value="ตรวจสอบ" />
</form>
<?
if(isset($_GET['txtID'])) {
    if(checkID($_GET['txtID']))
        echo "รหัสถูกต้องครับ";
    else
        echo "รหัสที่คุณกรอกไม่ถูกต้องค"; รับ
}
?>

เวอร์ชั่น ASP 3

<%
Function checkID(id)
    checkID = False
    If Len(id) = 13 Then
        Dim i, sum
        For i = 1 To 12
            sum = sum + CInt(Mid(id, i, 1))*(14-i)
        Next
        If (11-(sum Mod 11)) Mod 10 = CInt(Mid(id, i, 13)) Then
            checkID = True
        End If
    End If
End Function
%>
<form action="?" method="get">
รหัสประจำตัวประชาชน :
<input name="txtID" type="text" />
<input type="submit" value="ตรวจสอบ" />
</form>
<%
If Request("txtID") <> "" Then
    If checkID(Request("txtID")) Then
        Response.Write "รหัสถูกต้องครับ"
    Else
        Response.Write "รหัสที่คุณกรอกไม่ถูกต้องครับ"
    End If
End If
%>

จริงๆ แล้วถ้าเพื่อนๆ จะเอาไปใช้จริง ก็ Copy ไปเฉพาะฟังก์ชัน CheckID ก็ได้ครับ โดยพารามิเตอร์ตัวแรกของ CheckID ทั้ง 3 ภาษานี้คือ ข้อความที่เก็บรหัสประจำตัวประชาชนไว้ครับ
ฟังก์ชันนี้จะคืนค่าเป็น True ถ้ารหัสถูกต้อง และคืนค่าเป็น False ถ้ารหัสผิดครับ

สรุป

เราได้เรียนรู้วิธีการตรวจสอบเบื้องต้น (ข้อย้ำว่าเบื้องต้น) เพราะรหัสประชาชนที่ผู้ใช้กรอก อาจมี Check Digit ที่ถูกต้อง แต่อาจเป็นรหัสประชาชนที่ไม่มีอยู่จริงก็ได้นะครับ

13 ความเห็นบน “มาดูวิธีเช็ค ว่า “เขามั่วรหัสประชาชนรึเปล่า?”

  1. เหอะๆ ต่อไปคงต้องรื้อระบบใหม่แน่เลย คงต้องเข้ารหัสขนาด 32 bit
    แล้วเขียนเป็นเลขฐาน 16 เป็น Parity ต่อท้ายเลขประจำตัวประชาชนชัวร์ๆ

  2. ขอบคุณครับ แต่โค้ดข้างบน มีข้อผิดพลาด วงเล็บปีกกาหายไปหายที่ ไม่ทราบว่าตั้งใจ หรือเจตนานะครับ

    ผมแก้จาวสคริบต์เป็น แบบนี้ครับ

    function checkID(id) {
    var result = 0 ;
    if(id.length != 13){ result=0;}
    else{
    for(i=0, sum=0; i < 12; i++){
    sum += parseFloat(id.charAt(i))*(13-i);}
    if((11-sum%11)%10!=parseFloat(id.charAt(12)))
    {result=0;}
    else{
    result=1;}}
    if(result==1){document.getElementById(“explain”).innerHTML=”ถูกต้อง” ; }
    else{document.getElementById(“explain”).innerHTML=”ผิดพลาด” ;}
    }

    รหัสประจำตัวประชาชน :

ส่งความเห็นที่ nattster ยกเลิกการตอบ