一、手机号码的结构
手机号码通常由11位数字组成,其中前三位表示运营商,目前中国三大运营商分别是中国移动、中国联通和中国电信。前三位的编号如下:
中国移动:134、135、136、137、138、139、150、151、152、157、158、159、182、183、184、187、188、147、178
中国联通:130、131、132、155、156、185、186、145、176
中国电信:133、153、180、181、189、177、173、149
手机号码的第4-7位是为地区编码,表示该手机号属于哪个省份或直辖市。第8-11位是用户号码,全国每个号码段的数量都有限制,总共不超过1亿。
二、合法性验证
在进行数据处理之前,需要对这1000个随机手机号码进行合法性验证,主要包括以下几个方面:
- 是否为11位数字
function isPhoneNumber(phoneNumber) {
if (phoneNumber && /^[0-9]{11}$/.test(phoneNumber)) {
return true;
}
return false;
}
- 是否符合手机号码的规则
function isMobilePhoneNumber(phoneNumber) {
if (phoneNumber && /^1(3[0-9]|4[57]|5[0-35-9]|7[0135678]|8[0-9])\d{8}$/.test(phoneNumber)) {
return true;
}
return false;
}
- 是否属于三大运营商
function getMobileServiceProvider(phoneNumber) {
if (!isMobilePhoneNumber(phoneNumber)) {
return '';
}
var serviceProvider = '';
var mobileNumber = phoneNumber.substr(0, 7);
if (/^(134|135|136|137|138|139|150|151|152|157|158|159|182|183|184|187|188|147|178)/.test(mobileNumber)) {
serviceProvider = '中国移动';
} else if (/^(130|131|132|155|156|185|186|145|176)/.test(mobileNumber)) {
serviceProvider = '中国联通';
} else if (/^(133|153|180|181|189|177|173|149)/.test(mobileNumber)) {
serviceProvider = '中国电信';
}
return serviceProvider;
}
三、地区分布
根据手机号码第4-7位的地区编码,可以统计出这1000个随机手机号码的地区分布情况:
var provinces = {
'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': '海外'
};
function getPhoneNumberProvince(phoneNumber) {
var provinceCode = phoneNumber.substr(3, 2);
return provinces[provinceCode] ? provinces[provinceCode] : '未知地区';
}
var provinceCounts = {
'北京': 0,
'天津': 0,
'河北': 0,
'山西': 0,
'内蒙古': 0,
'辽宁': 0,
'吉林': 0,
'黑龙江': 0,
'上海': 0,
'江苏': 0,
'浙江': 0,
'安徽': 0,
'福建': 0,
'江西': 0,
'山东': 0,
'河南': 0,
'湖北': 0,
'湖南': 0,
'广东': 0,
'广西': 0,
'海南': 0,
'重庆': 0,
'四川': 0,
'贵州': 0,
'云南': 0,
'西藏': 0,
'陕西': 0,
'甘肃': 0,
'青海': 0,
'宁夏': 0,
'新疆': 0,
'台湾': 0,
'香港': 0,
'澳门': 0,
'海外': 0
};
for (var i = 0; i < 1000; i++) {
var province = getPhoneNumberProvince(phoneNumbers[i]);
provinceCounts[province]++;
}
四、重复号码
这1000个随机手机号码中是否存在重复号码,可以通过哈希表实现:
function hasDuplicatePhoneNumber(phoneNumbers) {
var hashTable = {};
for (var i = 0; i < phoneNumbers.length; i++) {
if (hashTable[phoneNumbers[i]]) {
return true;
} else {
hashTable[phoneNumbers[i]] = true;
}
}
return false;
}
如果 hasDuplicatePhoneNumber
返回 true
,则说明存在重复号码。
五、手机号码生成
如果需要生成指定数量的随机手机号码,可以采用以下方法:
- 保证前两位为11
function generateMobilePhoneNumber() {
var phoneNumber = '11';
for (var i = 0; i < 9; i++) {
phoneNumber += Math.floor(Math.random() * 10);
}
return phoneNumber;
}
- 保证前三位为运营商
var mobileServiceProviderNumberMap = {
'中国移动': /^(134|135|136|137|138|139|150|151|152|157|158|159|182|183|184|187|188|147|178)/,
'中国联通': /^(130|131|132|155|156|185|186|145|176)/,
'中国电信': /^(133|153|180|181|189|177|173|149)/
};
function generateMobilePhoneNumber(serviceProvider) {
if (!mobileServiceProviderNumberMap[serviceProvider]) {
return '';
}
var phoneNumber = mobileServiceProviderNumberMap[serviceProvider].toString().substr(1);
for (var i = 0; i < 8; i++) {
phoneNumber += Math.floor(Math.random() * 10);
}
return phoneNumber;
}
- 可以指定手机号的前7位
function generateMobilePhoneNumber(prefix) {
if (!/^[0-9]{7}$/.test(prefix)) {
return '';
}
var phoneNumber = prefix;
for (var i = 0; i < 4; i++) {
phoneNumber += Math.floor(Math.random() * 10);
}
return phoneNumber;
}