mport uuid
import time
array = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",
"w", "x", "y", "z",
"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V",
"W", "X", "Y", "Z"
]
start = time.time()
def get_short_id():
id = str(uuid.uuid4()).replace("-", '') # 注意这里需要用uuid4
buffer = []
for i in range(0, 8):
start = i * 4
end = i * 4 + 4
val = int(id[start:end], 16)
buffer.append(array[val % 62])
return "".join(buffer)
id_set = set() # 用于存放生成的唯一id
count = 0 # 用于统计出现重复的次数
index = [] # 记录第几次调用生成8位id出现重复
for i in range(0, 200000000):
id = get_short_id()
if id in id_set:
count += 1
index.append(str(i+1))
else:
id_set.add(id)
print('id:%s, 运行第 %s 次, 重复数:%s , 重复率:%s, 出现重复次序 %s' % (id, i+1, count, count/(i+1)*100, ','.join(index)))
end = time.time()
runTime = end - start
print('time cost : %.5f sec' %runTime)
print("运行时间:", runtime)
目前在网上找到的这些代码,测试的规模是2000万次随机生成,重复次数是2次,于是我想试试2亿次的随机生成会有多少次的重复次数呢?
经过几次小数据量的测试,我觉得速度蛮快的,于是我想试试2亿次会有什么结果,然而我对以上的代码运行时间估计太乐观了,运行了近30个小时 还没有出结果:
最终用时173456秒, 用了48小时,哭死....
生成2亿次8位随机码,重复次数95次, 约200万分之一.
重复分布:前1亿次重复22次,后3000次重复35次,总体上已有数据越多,重复几率更大.
花了超长时间跑出来的结果,分享了.
出现重复次序4912261,25109815,32333359,35410441,55589646,56476115,60858595,63105050,63514212,65615134,66200366,69775931,70602830,72576590,72999246,73988417,75776971,81133769,86240803,93757955,93866702,98284163,105333744,105425161,107047605,109154941,112563393,112807970,114714405,116031045,128196679,129116001,129904355,130034262,135008676,135426866,140723290,140946333,141671478,142307697,144187126,146084087,146546463,147028295,148836577,151822871,151857928,153661405,155546101,155660970,156796205,158792504,158886989,162399859,162796352,163017360,167480363,167887397,169019153,169047387,170838963,171152596,171177319,171338068,173369973,173733311,174546518,175833112,177722852,179057593,179209511,179736650,179986971,180844739,182485452,183430257,183868857,184688065,185510067,185610856,187492258,188712567,189112357,190692138,190823081,191111114,191216922,192224286,194401972,194597436,197659330,198202946,198511998,199332445,199626653