5S壞了,用了好幾年的手機(jī)畢竟是有感情的届吁,希望明天到的屏幕能夠拯救我親愛的5S吧
背景
最近公司在弄一個(gè)邀請碼的東西李茫,要搞一個(gè)生成的機(jī)制,理論上這是后端開發(fā)做的事情知押,但是我們的前端開發(fā)也去搞了一套這個(gè)驗(yàn)證碼的東西叹螟,有興趣的朋友可以看看《Javascript實(shí)現(xiàn)的一種簡單的推薦碼算法》。我也就順帶寫了一個(gè)驗(yàn)證重復(fù)的代碼台盯,最好控制一下比如1KW不會重復(fù)就行了罢绽。
驗(yàn)證重復(fù)
其實(shí)驗(yàn)證重復(fù)的邏輯很簡單,用Python
來處理就是幾行代碼的事静盅。主要流程就是從把生成的邀請碼讀取到一個(gè)列表中良价,然后用set
方法去重,最后比對去重前后列表的長度,就能知道有沒有重復(fù)了明垢。
代碼如下
import time
start = time.time()
with open('test.txt', 'r') as f:
data = f.readlines()
arr = [x.strip() for x in data]
old = len(arr)
new = len(set(arr))
print old
print new
if old == new:
print "success"
else:
print "error"
end = time.time()
print end-start
代碼中我加上了運(yùn)行時(shí)間的處理蚣常,可以觀察在讀取大量數(shù)據(jù)的時(shí)候的效率。
注 :請不要使用以下的方式來建立列表
testlist = []
for x in f.readlines():
testlist.append(x)
事實(shí)證明痊银,這種方式在數(shù)據(jù)量大的情況下效率會低很多史隆。
我們來做一個(gè)測試,使用1000W條數(shù)據(jù)來處理曼验。第一種方式的結(jié)果如下:
10000000
10000000
success
5.89996790886
第二種方式的結(jié)果如下:
10000000
10000000
success
7.04926991463
當(dāng)然泌射,結(jié)果也證明了我寫的驗(yàn)證碼在1KW條的情況下,不會出現(xiàn)重復(fù)的情況鬓照。
隨機(jī)邀請碼生成
一般我們看到的序列號或者邀請碼長成這樣的:BKMv-c1Nf-IvRr-ZAsy
熔酷,這種邏輯的生成也挺簡單的,就是取隨機(jī)的字母和數(shù)字豺裆,然后拼接起來就好了拒秘。
代碼如下:
#coding: utf-8
import string
import random
field = string.letters + string.digits
# 生成num位的隨機(jī)字母或數(shù)字組成的
def getSingleMa(num):
singleMa = "".join(random.sample(field, num))
return singleMa
# 把num個(gè)字符串拼接起來
def getAllMa(num):
AllMa = "-".join([getSingleMa(4) for i in range(num)])
return AllMa
# 生成num組邀請碼
def outMa(num):
AllMaList = [getAllMa(4) for i in range(num)]
return AllMaList
if __name__ == '__main__':
data = outMa(10000)
with open("test.txt", "w") as f:
for x in data:
f.write(x)
f.write('\n')
這樣本地就生成了一個(gè)名為test.txt
的邀請碼文件,里面有10000個(gè)邀請碼臭猜。
最后
我這種方式我驗(yàn)證了一下躺酒,在1KW條記錄的情況下,只要有4組4個(gè)字母組成的邀請碼蔑歌,基本上不會出現(xiàn)重復(fù)的情況羹应,我測試了大概20次,就只有一次出現(xiàn)了一個(gè)驗(yàn)證碼重復(fù)次屠。
當(dāng)然园匹,1E條邀請碼的情況我沒有測試,畢竟電腦配置有限劫灶,如果能夠使用多線程來生成多個(gè)文件裸违,最后再合并,應(yīng)該效果會快很多本昏。