ขอเริ่มบทความแบบพิสดารบ้างได้ไหมครับ ก่อนอ่านบทความต่อไป ผมขอนำเสนอ หมอดูที่ชื่อว่า “แม่นมั่กๆ”
หมอดู แม่นมั่กๆ
หมอดู แม่นมั่กๆ สามารถทำนายรหัสประชาชนหลักที่ 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 ที่ถูกต้อง แต่อาจเป็นรหัสประชาชนที่ไม่มีอยู่จริงก็ได้นะครับ
คิดถึงพี่นัทเตอร์จังเลย จะแวะมาอ่านบ่อยๆนะ
โค้ด php หายปะนาย – –
แก้ล่ะครับ 😀
เหอะๆ ต่อไปคงต้องรื้อระบบใหม่แน่เลย คงต้องเข้ารหัสขนาด 32 bit
แล้วเขียนเป็นเลขฐาน 16 เป็น Parity ต่อท้ายเลขประจำตัวประชาชนชัวร์ๆ
ขอบคุณครับ แต่โค้ดข้างบน มีข้อผิดพลาด วงเล็บปีกกาหายไปหายที่ ไม่ทราบว่าตั้งใจ หรือเจตนานะครับ
ผมแก้จาวสคริบต์เป็น แบบนี้ครับ
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=”ผิดพลาด” ;}
}
รหัสประจำตัวประชาชน :
@หฟานส เขียน if กะ for แบบมี statement เดียวน่ะครับ เลยไม่ใส่ { }
โค้ดให้ผลลัพธ์แบบเดียวกันกับที่คุณแก้มาครับ 😀
อันนี้มาจาก siamdev สมัยโน้นนนนนนนน เลยนี่นา
@narun ก็ตอนนั้นตั้งใจเขียนมากเลยน๊า… อิๆ
อยากจัง งง
อารายคือMOD-*-งงอยู่วิธีเดียววะ
Mod คือ หารเอาเศษครับ เช่น 10 mod 3 = 1 (10 หาร 3 ได้ 3 เศษ 1)
// <![CDATA[
function predict(id) {
if(id.length == 12) {
for(i=0, sum=0; i
แก้ไขแล้วนะครับ