1. 程式人生 > >隨機產生一個類似身份證號碼的18位字串

隨機產生一個類似身份證號碼的18位字串

我們在玩一些遊戲的時候,有的會要求我們填寫身份證資訊,而且有較為嚴格的身份證驗證,給人的感覺就像是真能驗證一樣,其實想要真正的驗證身份證資訊是否正確是需要接入公安部門的身份證查詢系統的.
然而並不是所有的軟體都能拿到這個許可權的,而沒有拿到許可權的他們是怎麼判斷的尼,其實答案就是身份證的最後一位,通過計算來判斷身份證的最後一位是否正確就行了.
下面我將提供兩種方式來產生一個隨機的18位字串
方式一:可自定義產生區間
public function random_card(){
       $city = array(11,12,13,14,15,21,22,23,31,32,33,34
,35,36,37,41,42,43,44,45,46,50,51,52,53,54,61,62,63,64,65,71,81,82,91); //校驗位 $parity = array('1','0','X','9','8','7','6','5','4','3','2'); // $a = array('a','b','c'); $arr = array(0,1,2,3,4,5); $str = ''; // echo $city[array_rand($city)]; //前兩位 $str .=$city
[array_rand($city)]; //地區位後四位 for($i=0;$i<4;$i++){ $str .=$arr[array_rand($arr)]; } //出生年 隨機20世紀 $str .= '19'.mt_rand(0,9).mt_rand(0,9); //月份 $month = array('01','02','03','04','05','06','07','08','09','10','11','12'); $str .=$month[array_rand($month
)]; //天 $day = mt_rand(0,3); if($day==3){ $str .=$day.mt_rand(0,1); }else{ $str .=$day.mt_rand(0,9); } //順序碼 for($i=0;$i<3;$i++){ $str .=mt_rand(0,9); } //計算加權因子 for($i=18;$i>1;$i--){ $factor[] = fmod(pow(2,$i-1),11); } //將加權因子和身份證號對應相乘,再求和 $sum = 0; for($i=0;$i<count($factor);$i++){ $sum +=$factor[$i]*$str[$i]; } //將sum對11求餘 $mod = fmod($sum,11); $str .=$parity[$mod]; echo $str; }

方式二:先隨機產生一個17位數字,再加上一位校驗碼,檢測該18位字串是否符合身份證規則

public function varifi_card($card=''){
        //將身份證轉化為string
       $cardStr = (string)$card;
       //驗證身份證長度是否為18位
       if(strlen($cardStr)==18){
//           驗證格式是否正確
           $pattern = "/\d{6}(18|19|20)?\d{2}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)/i";
           if(preg_match($pattern,$cardStr)){
                //匹配前兩位所對應的地區是否正確
               $city = array(11,12,13,14,15,21,22,23,31,32,33,34,35,36,37,41,42,43,44,45,46,50,51,52,53,54,61,62,63,64,65,71,81,82,91);
               if(in_array(substr($cardStr,0,2),$city)){
                   //計算加權因子
                   for($i=18;$i>1;$i--){
                       $factor[] = fmod(pow(2,$i-1),11);
                   }
                   //校驗位
                   $parity = array('1','0','X','9','8','7','6','5','4','3','2');
                    //將加權因子和身份證號對應相乘,再求和
                   $sum = 0;
                   for($i=0;$i<count($factor);$i++){
                       $sum +=$factor[$i]*$cardStr[$i];
                   }
                   //將sum對11求餘
                   $mod = fmod($sum,11);
//                   如果校驗位的第$mod位與身份證最後一位相等,則身份證驗證通過
                   if($parity[$mod]==substr($cardStr,-1,1)){
                        return true;
                   }else{
                       return false;
                   }
               }
           }else{
               echo '身份證格式錯誤';
           }
       }else{
           echo '輸入的18位身份證號碼';
       }
   }


 public function get_randomcard(){
       $str = '';
       $boolean = ture;
       //校驗位
       $parity = array('1','0','X','9','8','7','6','5','4','3','2');
       while ($boolean){
//           隨機一個17位的數字
           $str .=mt_rand(0,99999999999999999);
           $str .=$parity[array_rand($parity)];
//           判斷身份證是否正確
            $card = $this->varifi_card($str);
            if($card){
                //正確則返回
                return $str;
            }
       }
   }

相關推薦

隨機產生一個類似身份證號碼18字串

我們在玩一些遊戲的時候,有的會要求我們填寫身份證資訊,而且有較為嚴格的身份證驗證,給人的感覺就像是真能驗證一樣,其實想要真正的驗證身份證資訊是否正確是需要接入公安部門的身份證查詢系統的. 然而並不是所有

身份證號碼1518互轉

身份證各欄位意義: 工作需要,涉及到身份證號碼15位和18位的轉換,功能實現如下: # -*- coding:utf-8 -*- # 驗證身份證最後一位 ##1、將前面的身份證號碼17位數分別乘以不同的係數。從第一位到第十七位的係數分別為:7-9-10-5-8-4-2-1-6-3-7-9-

隨機產生一個十六進制的顏色值

<style> div{ width:300px; height:200px; background-color: pink; }</style><script> //隨機產生一個十六進位制的值 functi

居民身份證號碼的奧祕及身份證18(校驗碼)的計算方法

居民身份證是國家法定的證明公民個人身份的證件。為了堵塞和制止假居民身份證的流通和使用,在查驗和核查居民身份證時可掌握以下幾個要點:   一、居民身份證有效期限與持證人年齡、簽發日期的關係   居民身份證的有效期限分為10年、20年、長期三種。16週歲至25週歲的,發給有效期為10年的居民身份

JS校驗身份證號碼(1518)

//檢查生日是否正確 checkBirthday = function(card) { var len = card.length; //身份證15位時,次序為省(3位)市(3位)年(2位)月(2位)日(2位)校驗位(3位),皆為數字 if(len == '15') { var re_fifteen = /^

身份證號碼1518的轉換

程式初始介面: 輸入15為身份證號碼,點選“轉換”按鈕後,進行驗證:沒有輸入身份證號碼: 輸入的不是15位: 身份證號碼中包含非數字: 正確的身份證轉換為18位身份證,並顯示出生日期和性別: 點選“重新輸入”去空文字框等 轉換演算法: 在6位行政區劃後插入2為世紀程式碼

Javascript實現身份證號碼1518的演算法

改後的程式如下: <SCRIPT LANGUAGE="JavaScript"><!--var lastNumber;var id = "輸入15位身份證號碼"; //15位身份證號碼 //這裡最好還加上身份證號碼的檢查(略) //取得前面17位號碼var

身份證18(校驗碼)的計算方法

1、將前面的身份證號碼17位數分別乘以不同的係數。從第一位到第十七位的係數分別為:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。2、將這17位數字和係數相乘的結果相加。3、用加出來和除以11,看餘數是多少?4、餘數只可能有0-1-2-3-4-5-6-7-8-9-10這11個數字。其分

身份證18(校驗碼)如何計算

身份證校驗碼的計算方法 1、將前面的身份證號碼17位數分別乘以不同的係數。從第一位到第十七位的係數分別為:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。 2、將這17位數字和係數相乘的結果相加。 3、用加出來和除以11,看餘數是多少? 4、餘數只可能有0-1

java隨機產生一個字母轉換成大寫字母

此案例中包括使用三位運算和位運算轉換成大寫字母, 語句: (char)(int)(Math.random()*26+65)產生大寫字母A~Z, (char)(int)(Math.random()*26+97)產生小寫字母a~z, (char)(int)(Math.ra

js-隨機產生一個由10個元素組成的陣列

一.隨機產生一個由10個元素組成的一個數組。 第一步:建立一個隨機函式; 第二步:定義一個空陣列; 第三步:for迴圈遍歷,將隨機的每一個數新增在數組裡面。 上面的這一種方法,隨機產生的10個元素的陣列,其實是有重複的,下面的這種方法可以去重複。 二.隨機產生一個由10個

隨機產生一個整數

Random類 1.大家都是知道的在java裡工具類中本來就有一個可以隨機產生一個隨機數的類 Random類。 但是眾所周知的,這個類所產生一個隨機數是不排除不重複的部分,那麼今天我們就來實現一個隨機產生一個不重複的整數。 2.陣列的下標是不能重複的,當我們想要隨機的取陣

隨機產生一個限定範圍的long型數字

最近抓取新浪微博的資料,需要產生一些隨機微博的ID。由於新浪微博的ID是一個16位的數字,所以在Java程式中要用long型來產生。並且,微博ID是有一定範圍的,如果不限定範圍,命中的概率會很低。這裡就需要限定產生隨機數的範圍。然而,在Java SDK中,只提供了一個產生整

提供一個中國身份證號碼判斷的類

dbase 區域 rac 否則 方法調用 mar ant argument 字符 本文章的目的是實現一個用於身份證號碼判斷是否有效的功能 首先,創建一個身份證基類: /// <summary> /// 中國大陸身份證 /

18身份證號碼結構的系數算法

身份證號 clas com html con += 得到 math bsp 看了園子裏一個隨筆 http://www.cnblogs.com/10158wsj/p/7050736.html 身份證17位數分別乘以不同的系數。從第1位到第17位的系數分別為:7-9-1

15/18身份證號碼驗證的正則表達式總結(詳細版)

校驗碼 輸入 詳細 wid width adding 方式 http 效率 前言 開發過程中,常常需要對一些輸入信息進行有效性驗證,使用正則表達式進行校驗是最簡單、效率最高的方式了,下面就來看看15/18位身份證號碼驗證的正則表達式吧。 介紹 xxxxxx yyyy MM

18身份證號碼最後一校驗

void i++ apt div 身份證號碼 ++ print col str 1 package com.jdk7.chapter5; 2 3 /** 4 * 僅能校驗15位或18位身份證號的校驗碼 5 * @author Administrator

javascript 身份證號碼驗證函式(可辨真偽,支援15或18身份證號)測試誤差為0

話不多說,直接上程式碼,我不生產程式碼,我只是程式碼的搬運工。 //驗證身份證號方法 var test = function (idcard) { var Errors = new Array("驗證通過!", "身份證號碼位數不對!", "身份證號碼出生日期超出範圍或含有非法

老版身份證號碼轉為新版身份證號碼(1518

【問題描述】 老版的身份證號碼是15位的,有些政府網站上登記的是老版的號碼,15位,未做更新,所以需要手動更新為18位。 【解決辦法】 import numpy as np def id_corr

15/18身份證號碼正則表示式(詳細版)

xxxxxx yyyy MM dd 375 0     十八位 xxxxxx    yy MM dd   75 0     十五位 地區:[1-9]\d{5} 年的前兩位:(18|19|([23]\