生成随机身份证号

/**
 * 生成随机身份证号
 * @param  len 生成数量
 * @returns  { Array }
 */
export function getRandomIdcard(len = 1) {
  // 生成随机数,max最大值,base最小值
  function getRandom(max, base) {
    return Math.floor(Math.random() * max + (base || 0));
  }
  // 根据前17位生成末位
  function cnNewID(idcard) {
    let arrExp = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; // 加权因子
    let arrValid = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2]; // 校验码
    let sum = 0;
    for (let j = 0; j < 17; j++) {
      // 对前17位数字与权值乘积求和
      sum += parseInt(idcard[j], 10) * arrExp[j];
    }
    return arrValid[sum % 11];
  }
  const arr = [];
  for (let num = 0; num < len; num++) {
    let idcard = '';
    for (let i = 0; i < 18; i++) {
      if (i < 6) {
        idcard += getRandom(9, 1);
      } else if (i == 6) {
        idcard += getRandom(2, 1); //年份第一位仅支持1和2
      } else if (i == 7) {
        idcard += idcard[6] == '1' ? 9 : 0; //两位年份规则,仅支持19和20
      } else if (i == 8) {
        idcard += idcard[6] == '1' ? getRandom(7, 3) : getRandom(2); //三位年份规则,仅支持193-199、200、201这些值
      } else if (i == 9) {
        idcard += getRandom(10); //四位年份规则,0-9
      } else if (i == 10) {
        idcard += getRandom(2); //首位月份规则
      } else if (i == 11) {
        idcard += idcard[10] == '0' ? getRandom(9, 1) : getRandom(3); //末位月份规则
      } else if (i == 12) {
        let maxDays = new Date(idcard.substring(6, 10), idcard.substring(10, 12), 0).getDate(); // 获取当月最大天数
        let day = getRandom(maxDays, 1);
        idcard += day < 10 ? '0' + day : day;
      } else if (i > 13 && i < 17) {
        idcard += getRandom(10);
      } else if (i == 17) {
        idcard += cnNewID(idcard);
      }
    }
    arr.push(idcard);
  }
  return arr;
}
本文由博客群发一文多发等运营工具平台 OpenWrite 发布

GuMoYu
1 声望0 粉丝

墨鱼前端