รหัสบัตรประชาชน Modulo 11 Check-Digit Algorithm

December 22, 2007 – 11:32 pm

ลังจากที่ทำเว็ปไซต์มานาน เคยทำพวกระบบสมาชิกมาก็มากมาย ที่ผมทำระบบสมัครสมาชิก แล้วขู่ให้ใส่หมายเลขบัตรประชาชน เพื่อที่ต้องการกรองเฉพาะ สมาชิกที่น่าจะไว้ใจได้เท่านั้น แต่ที่ดูๆแล้ว ก็ยังมีพวก “มั่ว” หมายเลขบัตรเข้ามา ทำให้ผมต้องลบออกไปหลายคนเหมือนกัน คิดแล้วไม่ออกว่าจะทำอย่างไร ให้รู้ข้อมูลสมาชิกของคนๆ นั้น จริงๆ ศึกษาไปเรื่อยๆ ก็เจอ อีกหนึ่งช่องทาง แต่ยุ่งยากมาก เพราะต้องใช้ soap ติดต่อกับ webservice http://www.rd.go.th/webservice/new/tin.html เลยมาเจอเว็บหนึ่ง ซึ่งต้องขอขอบคุณhttp://www.siamdev.net มา ณ ที่นี้ ด้วย ที่เขียนบทความดีๆ จึงเอามาบอกกัน…เรื่องของ อัลกอริทึม Modulo 11 นี้ง่ายๆ(มั้ง) มีการนำไปใช้งานเพื่อตรวจสอบตัวเลขต่างๆ เช่น ตรวจสอบหมายเลจ ISBN ตามหนังสือ
ขอยกตัวอย่างของบัตรประชาชนไทยเลยแล้วกัน รหัสประจำตัวของเราจะอยู่ในรูป 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 ของหนังสือ เราก็ต้องใช้วิธีการคำนวณ ที่แตกต่างกันออกไปครับ

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

นี่ฉบับที่เขียนด้วย JavaScript มาดูกัน

<script language=”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(’รหัสประชาชนถูกต้อง เชิญผ่านได้’);
}
</script>
<form name=”form1″ onsubmit=”checkForm(); return false;”>
รหัสประจำตัวประชาชน : <input type=”text” name=”txtID” />
<input type=”submit” value=”ตรวจสอบ” />
</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 type=”text” name=”txtID” />

<input type=”submit” value=”ตรวจสอบ” />
</form>
<?
if(isset($_GET[’txtID’])) {
if(checkID($_GET[’txtID’]))
echo “รหัสถูกต้องครับ”;
else
echo “รหัสที่คุณกรอกไม่ถูกต้องครับ”;
}
?>

จริงๆการทำงานคือหลักการง่ายๆครับ เรียกใช้งานจากฟังชั่นที่เขียนไว้ จริงๆ ถ้าจะเอาไปใช้จริง ก็ Copy ไปเฉพาะฟังก์ชัน CheckID ก็ได้ครับ โดยพารามิเตอร์ตัวแรกของ CheckID ทั้งสองอันนี้คือ ข้อความที่เก็บรหัสประจำตัวประชาชนไว้ครับ ฟังก์ชันนี้จะคืนค่าเป็น True ถ้ารหัสถูกต้อง และคืนค่าเป็น False ถ้ารหัสผิดครับ แค่นี้เราก็ป้องกันคนมามั่วหมายเลขบัตรได้ระดับนึ่งแล้ว 555+
Credit http://www.siamdev.net


Leave a reply

:mrgreen: :| :twisted: :arrow: 8O :) :? 8) :evil: :D :idea: :oops: :P :roll: ;) :cry: :o :lol: :x :( :!: :?:

  1. You will post the following soon.
    Go ahead and start typing.