<?
// http://home.so-net.net.tw/idealist/Other/SSN.html
// http://www.southmaster.com/artic ... =red2.php&id=53
// 驗證 function
function checkid($id){ // 接收的變數為 id
$id = strtoupper($id); // 將英文字母轉換成大寫
// strtolower() 轉換成小寫
// 英文字母轉換成兩位數字,加權後相加的值
$headPoint = array(
'A'=>1,'I'=>39,'O'=>48,'B'=>10,'C'=>19,'D'=>28,
'E'=>37,'F'=>46,'G'=>55,'H'=>64,'J'=>73,'K'=>82,
'L'=>2,'M'=>11,'N'=>20,'P'=>29,'Q'=>38,'R'=>47,
'S'=>56,'T'=>65,'U'=>74,'V'=>83,'W'=>21,'X'=>3,
'Y'=>12,'Z'=>30
);
// 權重規則陣列
$multiply = array(8,7,6,5,4,3,2,1);
// 開始驗證身份証字號
if(ereg("^[a-zA-Z][1-2][0-9]+$",$id) and strlen($id) == 10){
// 正則表示式
$len = strlen($id);
for($i=0;$i<$len;$i++){
$stringArray[$i] = substr($id,$i,1); // 將字串提取出來存放
}
// 取得字母的分數
$total = $headPoint[array_shift($stringArray)];
//echo $total;
// 取得檢查號碼
$point = array_pop($stringArray);
//echo $point;
// 計算去頭去尾之後的長度
$len = count($stringArray);
//echo $len;
// 計算加權後的分數
for($j=0;$j<$len;$j++){
$total += $stringArray[$j]*$multiply[$j];
// $a += 5*2 ---> $a = $a+5*2
}
//echo $total;
// 求餘數
$last = (($total%10) == 0)?010-($total%10));
/*
if($total%10 == 0){
$last = 0;
}else{
$last = 10 - ($total%10);
}
*/
if($last == $point){
echo "正確";
}else{
echo "錯誤";
}
}
}
function getid(){
// 城市的加權
$city = array(
'A'=>1,'I'=>39,'O'=>48,'B'=>10,'C'=>19,'D'=>28,
'E'=>37,'F'=>46,'G'=>55,'H'=>64,'J'=>73,'K'=>82,
'L'=>2,'M'=>11,'N'=>20,'P'=>29,'Q'=>38,'R'=>47,
'S'=>56,'T'=>65,'U'=>74,'V'=>83,'W'=>21,'X'=>3,
'Y'=>12,'Z'=>30
);
$id = chr(mt_rand(65,90)).
array_pop(explode('.',uniqid(rand(),true)));
// chr() 取得 ascii 對應的大寫字母 A:65 Z:90
// 取得一組八位數的數組
$id[1] = rand(1,2); // 取得性別
//$id[1] = substr($id,1)%2 + 1; 取得性別
// 計算加權的總和
$total = $city[$id[0]]; // 取得城市的加權
for($i=1;$i<=8;$i++){ // 第 2 - 8 數字的加權總合
$total += $id[$i] * (9-$i);
}
$checkcode;
if($total%10 == 0){
$checkcode = 0;
}else{
$checkcode = 10 - ($total%10);
}
return $id.$checkcode; // 回傳身分證字號
}
echo getid();
?> |