Files
a_long/utils/yaoqingma_utils.py
2026-06-14 02:38:05 +08:00

89 lines
2.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
阿龙电竞陪玩平台 - 邀请码生成工具
生成规则:毫秒时间戳 + 用户ID + 随机数 -> Base62编码 -> 固定20位邀请码
特点:唯一性高、生成快、无序不可读
"""
import time
import random
# Base62 编码字符集 (数字+小写字母+大写字母)
_BASE62_CHARS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
_BASE62_LENGTH = 62
def base62_encode(num):
"""将数字转换为Base62字符串"""
if num == 0:
return _BASE62_CHARS[0]
result = []
while num > 0:
num, remainder = divmod(num, _BASE62_LENGTH)
result.append(_BASE62_CHARS[remainder])
# 反转结果字符串
return ''.join(reversed(result))
def chuangjianYaoqingma(yonghuid_str):
"""
创建唯一邀请码 (20位固定长度)
参数:
yonghuid_str: 用户ID字符串"123456"
返回:
20位的Base62编码邀请码字符串
"""
# 1. 获取当前毫秒时间戳 (13位)
timestamp_ms = int(time.time() * 1000)
# 2. 将用户ID字符串转换为数字 (确保处理字符串)
try:
# 先尝试直接转换整数
yonghuid_num = int(yonghuid_str)
except ValueError:
# 如果用户ID不是纯数字使用哈希值
yonghuid_num = abs(hash(yonghuid_str)) % (10 ** 8) # 取8位数字
# 3. 生成一个随机数 (0-9999)
random_salt = random.randint(0, 9999)
# 4. 组合数字: 时间戳(13位) + 用户ID数字(最多8位) + 随机数(4位)
# 示例: 1647850123456 + 123456 + 7890 = 16478501234561234567890
combined_num = int(f"{timestamp_ms}{yonghuid_num:08d}{random_salt:04d}")
# 5. Base62编码
encoded_str = base62_encode(combined_num)
# 6. 确保固定20位长度: 不足补0超过取后20位
# 理论上组合数字非常大编码后通常会超过20位
if len(encoded_str) < 20:
# 左补0 (理论上不会发生,但保持安全)
encoded_str = encoded_str.rjust(20, _BASE62_CHARS[0])
else:
# 取后20位 (更随机)
encoded_str = encoded_str[-20:]
return encoded_str
def yanzhengYaoqingmaWeiyixing(yaoqingma):
"""
验证邀请码是否有效 (简单的格式验证)
参数:
yaoqingma: 待验证的邀请码
返回:
bool: 邀请码格式是否有效
"""
if not yaoqingma or len(yaoqingma) != 20:
return False
# 检查是否只包含Base62字符
for char in yaoqingma:
if char not in _BASE62_CHARS:
return False
return True