1. 程式人生 > 實用技巧 >redis 定義序列號

redis 定義序列號

規則

# 舉例  AA20201102NN1234567X
# 規則 [產品號2位]+[生成日期8位]+[內部品類號2位]+[序列號7位數字]+[校驗碼]
# 校驗碼生成規則
# a = 產品號
# b = 生成日期
# c = 產品批次/內部品類
# d = 生成序列號
# m = ( hash( a+b+c+d ) + d ) / 26
# 校驗碼等於 m 轉成字元,值域 A~Z 0~9

連結redis使用

class SerialNumber(object):
    _key = None  # 自增ID key

    def __init__(self, product_code, batch):
        self.product_code 
= product_code self.batch = batch self.times = time.strftime("%Y%m%d", time.localtime(time.time())) self._key = f"{self.product_code}__{self.batch}__{self.times}" def get_serial_number(self): # 首先獲取redis 自增ID redis_con = RedisCrease(self._key) incr_id
= redis_con.get_crease_id() # 自增ID # 序列號 serial_num = self.product_code + self.times + self.batch + incr_id.zfill(7) # 加校驗碼 m = hash(serial_num) + int(incr_id) # 計算校驗碼 checks = divmod(m, 26)[1] if checks <= 9: check_str = str(checks)
else: check_str = chr(checks + 55) return serial_num + check_str def check_serial_number(self, nums): # 校驗序列號 m = hash(nums[:-1]) + int(nums[12:-1]) check = divmod(m, 26)[1] if check <= 9: checks = str(check) else: checks = str(check) return checks == nums[-1] # if "__main__" == __name__: # sno = get_serial_number("RG", "SK") # print(sno) # is_check = check_serial_number(sno) # print(is_check) # if "__main__" == __name__: # serial_obj = SerialNumber("RG", "SK") # sno = serial_obj.get_serial_number() # print(sno) # is_check = serial_obj.check_serial_number(sno) # print(is_check)