python随机生成md5及sha256数据(手机号/imei)

脚本要求
  • 需要造手机号或者设备号的数据(加密md5或sha256),也可两者合并(用下划线隔开)
  • 需要造历史月份字段数据,可自定义或者区域随机,也可不带;
  • 需要带目标字段(枚举:0 or 1),也可不带;

应用的库包含:
import pandas as pd
import hashlib
import random
import os
from time import strftime,localtime,mktime

1. 先定义好造数据类型

def table_title(title,online):
    if title=="all":
        columns = ["imei","phone","历史月份", "结果值"]
    elif title=="imei":
        columns = ["imei","历史月份", "结果值"]
    elif title=="phone":
        columns = ["phone","历史月份", "结果值"]
    online_columns=columns[:-2]
    table_title=columns if online==0 else online_columns
    return table_title

定义不同场景下的字段,如果不需要带辅助参数,调用时online传非0即删除后面两位字段;

2. 定义加密方式的函数

def md5(data_md5):
    data_md5=hashlib.md5(data_md5.encode(encoding='UTF-8')).hexdigest()
    return data_md5
def sha256(data_sha256):
    data_sha256 = hashlib.sha256(data_sha256.encode(encoding='UTF-8')).hexdigest()
    return data_sha256

md5和sha256分别定义一个函数,结合使用

3. 逻辑处理:结合生成样本进行数据处理

def data_list(total,title,encrypt,online,month_b,month_a,label_type,test_c=0):
    result_list=[]
    #定手机号和设备号的开头数据
    num_phone,num_imei=188,98
    #定随机手机号和设备号的限制区间
    num_a,num_b=10000000+test_c,99999999
    num_a2,num_b2=10000000000+test_c,99999999999
    #对区域内月份取值以及枚举的目标值定义
    def month_handle(month_a):
        month_a=month_b-1 if month_a==None else month_a
        month=month_bug(str(month_a),str(month_b))
        label =random.randint(0,1) if label_type==None else label_type
        return month,label
    #total次数为需要生成的样本数量
    for i in range(total):
        num_data=str(random.randint(num_a, num_b))
        num_data2=str(random.randint(num_a2, num_b2))
        #生成所有字段都需要的情况
        if title=="all":
            phone=md5(str(num_phone) + num_data) if encrypt=="md5" else sha256(str(num_phone) + num_data)
            imei =md5(str(num_imei) + num_data2) if encrypt=="md5"  else sha256(str(num_imei) + num_data2)
            if online==0:
                month,label=month_handle(month_a)
                result_list.append([imei,phone,month,label])
            else:
                result_list.append([imei,phone])
        #生成imei需要的情况
        elif title=="imei":
            imei =md5(str(num_imei)+ num_data2) if encrypt=="md5" else sha256(str(num_imei) + num_data2)
            if online==0:
                month,label=month_handle(month_a)
                result_list.append([imei,month,label])
            else:
                result_list.append([imei])
        #生成phone需要的情况
        elif title=="phone":
            phone=md5(str(num_phone) + num_data) if encrypt=="md5" else sha256(str(num_phone)+ num_data)
            if online==0:
                month,label=month_handle(month_a)
                result_list.append(["_"+phone,month,label])
            else:
                result_list.append(["_"+phone])
    return result_list

4. 逻辑处理:对生成的总样本数量控制

def zhu_start(total,title,encrypt,online,month_b,month_a=None,label_type=None,size_m=100):
    #定好需要生成文件的标题
    columns = table_title(title,online)
    time=strftime("%mm%dd%Hh%Mm%Ss",localtime())
    #fuhao是给两者连接的分割符,division是切割作用,分批次生成总样本条数
    fuhao,division="_",1000
    size_kb=(1024*size_m)-(division/10)
    month_aa="" if month_a==None else str(month_a)+"-"
    #file_name是生成的文件名称,只是纯粹用于好区分
    file_name=str(total)+fuhao+title+fuhao+encrypt+fuhao+str(month_aa)+str(month_b)+fuhao+time
    def  pd_data(division,test_c=0):
        result_list = data_list(total,title,encrypt,month_a=month_a,month_b=month_b,online=online,label_type=label_type)
        dt = pd.DataFrame(result_list,columns=columns)
        dt.to_csv(file_name+".csv",mode="a",index=0, encoding="gb2312")
        return os.path.getsize(file_name+".csv")
    #小于分割数量的总条数情况,一次性让其生成
    if total <= division:
        file_size=pd_data(total,0)
        print("1、生成样本条数:"+str(total)+"\n2、生成文件大小:"+str(round(file_size/1024,4))+"kb")
    #大于分割数量的总条数情况,分批次生成
    else:
        #此处对余数做了个处理,避免非分割数整数情况导致余数的量未生成
        test_a,test_b=int(total/division),total%division
        test_a=test_a+1 if test_b != 0 else test_a
        for i in range(test_a):
            fale_header=True if i==0 else None
            test_c=i*division
            division=test_b if i==test_a-1 else division
            file_size=pd_data(division,test_c)
            #对生成的文件大小做个限制,防止手误生成超大数据,默认不超过100兆
            if (file_size)/1024 > size_kb:
                print("1、生成样本条数:"+str((test_a-1)*division+test_b)+"\n2、生成文件大小:"+str(round(file_size/1024,4))+"kb")
                exit()
        print("1、生成样本条数:"+str((test_a-1)*division+test_b)+"\n2、生成文件大小:"+str(round(file_size/1024,4))+"kb")

4. 历史月份的处理(bug修复)

def month_bug(month_a,month_b):
    start_a,start_b=month_a[:-2],month_a[-2:]
    end_a,end_b=month_b[:-2],month_b[-2:]
    a1=(int(start_a),int(start_b),1,0,0,0,0,0,0) 
    a2=(int(end_a),int(end_b),31,23,59,59,0,0,0) 
    t=random.randint(mktime(a1),mktime(a2)) 
    return strftime("%Y%m",localtime(t))

在后面使用的时候,发现自定义月份区域时跨年会出现数据生产错误;因为月份是12月进一年的,后面加了这块逻辑;对传入的参数用randint方法进行随机取值,解决这个问题;

5. main实例

参数解释如下(*号必填):
#total*:需要生成的样本数量,已默认限制文件生成不大于100M;如想大于可结合size_m使用
#title*:all为四类字段都包含,可设置单独imei或者phone
#encrypt*:加密类型,可设置md5或者sha256
#online*:可设置0(离线)或者1(在线)
#mothe_a:历史月份起始日期 + month_b*历史月份结束日期(随机期间月份);如统一月份month_a不填或者为None
#label_type:可根据要求生成0或者1,不填默认自动随机
#size_m:如想生成大于100M,举例生成101兆,添加size_m=101(单位兆),totale设置无穷大即可
if __name__ == '__main__':
    zhu_start(total=100,title="phone",encrypt="md5",online=1,month_a=202105,month_b=202105,label_type=None)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。