From 2aed3fcaea05bf7bbeca58a8f64a78913ef79409 Mon Sep 17 00:00:00 2001 From: ibuler Date: Sat, 7 Oct 2023 11:35:25 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E4=BF=AE=E6=94=B9=E9=9A=8F=E6=9C=BA?= =?UTF-8?q?=E6=95=B0=E7=94=9F=E6=88=90=EF=BC=8C=E9=81=BF=E5=85=8D=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=20random=20=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/common/utils/random.py | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/apps/common/utils/random.py b/apps/common/utils/random.py index 166453da6..505fbd041 100644 --- a/apps/common/utils/random.py +++ b/apps/common/utils/random.py @@ -18,6 +18,20 @@ def random_ip(): return socket.inet_ntoa(struct.pack('>I', random.randint(1, 0xffffffff))) +def random_replace_char(s, chars, length): + using_index = set() + seq = list(s) + + while length > 0: + index = secrets.randbelow(len(seq) - 1) + if index in using_index or index == 0: + continue + seq[index] = secrets.choice(chars) + using_index.add(index) + length -= 1 + return ''.join(seq) + + def random_string(length: int, lower=True, upper=True, digit=True, special_char=False, symbols=string_punctuation): if not any([lower, upper, digit]): raise ValueError('At least one of `lower`, `upper`, `digit` must be `True`') @@ -31,12 +45,10 @@ def random_string(length: int, lower=True, upper=True, digit=True, special_char= ) chars = ''.join([i[1] for i in chars_map if i[0]]) texts = list(secrets.choice(chars) for __ in range(length)) + texts = ''.join(texts) + # 控制一下特殊字符的数量, 别随机出来太多 if special_char: symbol_num = length // 16 + 1 - symbol_index = random.choices(list(range(1, length - 1)), k=symbol_num) - for i in symbol_index: - texts[i] = secrets.choice(symbols) - - text = ''.join(texts) - return text + texts = random_replace_char(texts, symbols, symbol_num) + return texts