สาเหตุที่ผมเขียนบทความนี้ขึ้นมา เพราะว่ามันจะมีบางช่วงเวลาที่ผมจำเป็นต้องใช้หมายเลขบัตรประชาชนในการทำอะไรหลาย ๆ อย่าง ไม่ว่าจะเป็นเรื่องของการทำระบบ verify หมายเลขบัตรประชาชน หรือเอาไปใช้สมัครโน่นสมัครนี่ บางครั้งผมแค่อยากลองเฉย ๆ แต่ไม่ได้อยากใช้หมายเลขบัตรของผมจริง ๆ ด้วยเหตุผลด้านความปลอดภัยของผมเอง ผมเลยลองสร้างหมายเลขบัตรประชาชนจากอัลกอริธึมในการตรวจสอบหมายเลขบัตรประชาชนขึ้นมา
อัลกอริธึมในการตรวจสอบหมายเลขบัตรประชาชน สามารถหาได้ตามเว็บทั่ว ๆ ไป ที่ผมได้มาก็จะประมาณนี้ครับ (Javascript)
function validate_thai_citizen_id(id)
{
var b = 0;
if (id.length < 13) return false;
checksum = id.substring(12, 13);
for (var i = 0; i < 12; i++)
{
b += parseInt(id.substring(i, i+1)) * (13 - i);
}
tmp = 11 - (b % 11);
switch(tmp)
{
case 11: check = 1; break;
case 10: check = 0; break;
default: check = tmp;
}
return (check == checksum);
}
จาก code ด้านบน เราจะเห็นได้ว่าส่วนที่สำคัญที่สุดคือ digit สุดท้าย ซึ่งจะทำหน้าที่เป็น checksum digit ซึ่งเราสามารถคำนวณได้จาก 12 digits แรก
เมื่อเราเอามาจัดการเขียนให้เป็นเรื่องเป็นราวจะได้แบบนี้ครับ
function generate_thai_citizen_id()
{
$checksum = 0;
$b = 0;
$r = 0;
$t = "";
mt_srand();
for ($i = 0; $i < 12; $i ++)
{
$r = mt_rand(0, 9);
$b += $r * (13 - $i);
$t .= "$r";
}
$tmp = 11 - ($b % 11);
switch($tmp)
{
case 11: $check = 1; break;
case 10: $check = 0; break;
default: $check = $tmp;
}
$t .= $check;
return $t;
}
Code ด้านบนนี้ผมพอร์ตมาจาก Javascript version ที่ผมทำไว้ให้เป็น PHP ครับ
ลองดูหน้าที่ทำเสร็จแล้ว (PHP) ได้ที่ LIVE DEMO เลยครับ
ปล. หมายเลขบัตรประชาชนที่สร้างจาก LIVE DEMO สามารถนำไปใช้ได้จริงนะครับ ใช้ให้ถูกที่ถูกกฏหมายนะครับ
ปล. อีกที วันที่ 9 ก.ย. 52 ผมแก้ไข code ที่เป็น เวอร์ชั่น php ให้ถูกต้องครับ มีบักนิดหน่อย
ขอทีเถอะ
ขออะไรครับ
ขอทีเถอะ
ทำไมผมแปลงจาก js เป็น php แล้ว
ตรวจสอบผิดตลอดเลยอะ ผิดตรงไหนเนี้ย
function validate_thai_citizen_id($id)
{
$id = intval(trim($id));
$b = 0;
if ( strlen($id) < 13) return false;
$checksum = substr($id, 12, 13);
for ( $i = 0; $i < 12; $i++)
{
$b += intval( substr( $id , $i, $i + 1) ) * (13 – $i);
}
$tmp = 11 – ( $b % 11);
switch( $tmp )
{
case 11: $check = 1; break;
case 10: $check = 0; break;
default: $check = $tmp;
}
return ( $check == $checksum );
}
ฮาๆ ผมเอามาเขียนใหม่ แก้ได้แบบนี้ครับ
เวิร์กแล้วว
เยี่ยมๆๆๆๆๆๆ
พอดี ไปอ่านเจอ อัลกอริทึม ในการคิดมาอะ
http://www.mindphp.com/modules.php?name=News&file=article&sid=62
function validate_thai_citizen_id($id)
{
$b = 0;
if ( strlen($id) < 13) return false;
$checksum = substr($id, 12);
for ( $i = 0; $i < 12; $i++)
{
$b += $id[$i] * (13 – $i);
}
$tmp = 11 – ( $b % 11);
switch( $tmp )
{
case 11: $check = 1; break;
case 10: $check = 0; break;
default: $check = $tmp;
}
return ( $check == $checksum );
}
ตกลงเค้าขออะไรทีนึงเนี่ย
555 ไม่มีอะไรพี่ อย่าคิดมาก อิอิอิ