目前公司的產品會通過sn綁定賬號,但是會出現一個問題,流水號會容易被人猜出來導致被他人在未授權的情況下使用,所以開發了一個生成流水號后打亂的python程序,比如輸入sn的前11位后,后面的字符所有的排列組合有26^4方種,然后隨機打亂后,取這次生產要用的前10000個,這樣可以降低被猜中的概率,以下是實現的代碼,至于說如何保證不同批次的sn不重復,只要保證前11位不重復即可
使用方式如下,先按要求輸入前11位,然后輸入你的字符集,比如? a,b,c,d,e 這樣就會窮盡這幾個的排列組合后打亂? 當然可以是任意字符 比如特殊字符@#$這種 或者你可以26個字母里面排除某些字母作為后面4位字符排列組合時選取的字符集,最后會生成csv格式的文件,方便給工廠的生成流程使用
import random
import csv
from itertools import productdef generate_custom_sn_csv():# 輸入前11位SN(自動驗證長度)prefix = input("請輸入前11位SN:").strip()while len(prefix) != 11:print("錯誤:必須輸入恰好11個字符!")prefix = input("請重新輸入前11位SN:").strip()# 輸入自定義字符集合chars = input("請輸入后4位字符集合(例如:a,b,c,d,e,f):").strip()char_set = [c.strip() for c in chars.split(',')] if chars else []while not char_set or len(char_set) < 2:print("錯誤:至少需要2個不同字符!")chars = input("請重新輸入后4位字符集合(例如:a,b,c,d,e,f):").strip()char_set = [c.strip() for c in chars.split(',')]# 生成所有4位排列組合all_combinations = [''.join(p) for p in product(char_set, repeat=4)]# 隨機打亂順序random.shuffle(all_combinations)# 生成完整SN列表sn_list = [f"{prefix}{suffix}" for suffix in all_combinations]# 寫入CSV文件filename = f"custom_sns_{len(char_set)}chars.csv"with open(filename, 'w', newline='', encoding='utf-8') as csvfile:writer = csv.writer(csvfile)writer.writerow(['Serial_Number']) # 寫入標題行writer.writerows([[sn] for sn in sn_list]) # 逐行寫入SNprint(f"成功生成包含{len(sn_list)}個SN的CSV文件:{filename}")print(f"字符集合:{char_set},排列組合總數:{len(char_set)**4}")print("示例數據預覽:")print(sn_list[:10]) # 打印前10個結果預覽if __name__ == "__main__":generate_custom_sn_csv()
生成如下