这个代码示例展示了如何使用Python和多线程来生成手机号码、计算MD5哈希,并将结果保存到MySQL数据库中。这个程序的主要功能包括:
- 生成号码:根据指定的前缀和范围生成一系列11位手机号码。
- 计算MD5哈希:为每个电话号码计算其MD5哈希值。
- 保存到数据库:将生成的手机号码及其MD5哈希保存到MySQL数据库中。
- 多线程处理:使用
ThreadPoolExecutor进行多线程并发,支持同时处理多个号段,提高效率。
代码的核心部分
- 号码生成:
generate_phone_numbers函数根据前缀和起始、结束后缀生成一系列电话号码。 - MD5哈希:
md5_hash函数用于计算字符串的MD5哈希值。 - 保存到数据库:
save_to_database函数连接到MySQL数据库,并将生成的号码及其MD5哈希存储在一个表中。 - 多线程处理:
process_phone_range函数用于处理一个号段的电话号码,并将其保存到数据库。
注意事项
- MySQL连接:确保在运行代码前,数据库连接信息正确,包括主机、用户、密码和数据库名。
- 表格文件:代码从Excel文件中读取号段信息。确保输入的Excel文件格式正确,并且包含“号段”列。
- 多线程:多线程并发可能导致数据库连接问题,确保数据库配置可以处理并发请求。
优化建议
- 错误处理:添加更多的错误处理,以应对可能出现的数据库连接问题、数据完整性问题等。
- 性能优化:在多线程场景中,注意数据库的连接池配置,避免连接过载。
- 并发安全:确保多线程环境下的数据处理和写入操作是安全的,不会导致数据冲突。
- 日志记录:增加日志记录,方便调试和监控程序运行状态。
这个代码示例适用于处理大量手机号码并将其存储到数据库的场景,但实际应用中,务必确保遵守相关法律法规,特别是与个人隐私和数据保护相关的规定。
import pandas as pd
import hashlib
import mysql.connector
from concurrent.futures import ThreadPoolExecutor
def generate_phone_numbers(prefix, start_suffix=0, end_suffix=9999):
phone_numbers = []
for i in range(start_suffix, end_suffix + 1):
phone_number = prefix + str(i).zfill(4) # 补齐至11位手机号码
phone_numbers.append(phone_number)
return phone_numbers
def md5_hash(text):
md5_hash = hashlib.md5()
md5_hash.update(text.encode('utf-8'))
md5_hex = md5_hash.hexdigest()
return md5_hex
def save_to_database(phone_numbers, current_count):
conn = mysql.connector.connect(
host='192.168.126.8',
user='root',
password='这是个密码',
database='MD5-02'
)
cursor = conn.cursor()
cursor.execute('''CREATE TABLE IF NOT EXISTS PhoneNumbers2
(ID INT AUTO_INCREMENT PRIMARY KEY, PhoneNumber VARCHAR(15), MD5Hash VARCHAR(32) UNIQUE)''')
count = 0 # 记录写入条数
for phone_number in phone_numbers:
md5 = md5_hash(phone_number)
try:
cursor.execute("INSERT INTO PhoneNumbers2 (PhoneNumber, MD5Hash) VALUES (%s, %s)", (phone_number, md5))
count += 1
current_count += 1
print(f"写入手机号码:{phone_number},当前写入数量:{current_count}", end='\r', flush=True)
except mysql.connector.IntegrityError:
# 如果手机号已存在,则跳过
continue
cursor.execute("CREATE INDEX idx_md5hash ON PhoneNumbers2 (MD5Hash)")
conn.commit()
conn.close()
return current_count
def process_phone_range(prefix, current_count):
phone_numbers = generate_phone_numbers(prefix)
current_count = save_to_database(phone_numbers, current_count)
return current_count
def main():
filename = input("请输入包含号段的表格文件名(例如:phone_ranges.xlsx):")
df = pd.read_excel(filename)
max_workers = int(input("请输入线程数量:"))
total_count = 0
with ThreadPoolExecutor(max_workers=max_workers) as executor:
futures = []
for index, row in df.iterrows():
prefix = str(row['号段'])
print(f"正在处理号段:{prefix}")
futures.append(executor.submit(process_phone_range, prefix, total_count))
for future in futures:
total_count = future.result()
print(f"当前写入总数量:{total_count}")
print("所有号段写入数据库完成")
if __name__ == "__main__":
main()

本文介绍了如何使用Python和多线程技术生成手机号码、计算MD5哈希,并将结果保存到MySQL数据库。代码涉及生成号码、MD5哈希计算、数据库连接及并发处理,还提供了优化建议如错误处理和性能调整。
523





