python生成指定长度的随机字母和数字组成的字符串

用到的包
import time
import random
import string
import secrets

生成指定长度的随机字母和数字组成的字符串
def generate_random_string(n):
    # 定义字符集(字母 + 数字)
    characters = string.ascii_letters + string.digits  # a-z, A-Z, 0-9
    # 从字符集中随机选择n个字符并拼接成字符串
    return ''.join(random.choices(characters, k=n))

使用加密的方式保证安全性
def generate_secure_random_string(n: int) -> str:
    characters = string.ascii_letters + string.digits
    # 使用安全的随机生成器选择字符
    return ''.join(secrets.choice(characters) for _ in range(n))
自定义字母、数字,生成的方式更灵活
def generate_clear_random_string(n: int) -> str:
    # 排除易混淆字符
    safe_letters = 'abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'
    safe_digits = '23456789'
    characters = safe_letters + safe_digits
    return ''.join(random.choice(characters) for _ in range(n))
常规for循环生成
def generate_random_letter_and_num(n):  # 生成指定长度n的随机字母和数字组成的字符串
    ret = ""
    for i in range(n):
        num = random.randint(0, 9)
        # num = chr(random.randint(48,57))#ASCII表示数字
        letter = chr(random.randint(97, 122))  # 取小写字母
        Letter = chr(random.randint(65, 90))  # 取大写字母
        s = str(random.choice([num, letter, Letter]))
        ret += s
    return ret

方法性能分析
方法名称核心逻辑性能瓶颈时间复杂度实际耗时/s(循环调用1000次,每次生成长度10000的字符串)
generate_random_string使用random.choices一次性生成n个字符无循环,底层C优化O(n)0
generate_secure_random_string循环调用secrets.choice,用列表推导式拼接加密耗时O(n)5
generate_clear_random_string循环调用random.choice,用列表推导式拼接循环调用函数(Python解释器开销)O(n)2
generate_random_letter_and_numn次循环,+ 字符串拼接多次随机数生成 + 低效字符串拼接(O(n²))O(n²)13
关键点分析
  • random.choices VS secrets.choice

    方法random.choicessecrets.choice
    所属模块random(通用随机数)secrets(加密安全随机数)
    返回值数量可返回多个元素(通过 k 参数指定)仅返回一个元素
    权重支持支持概率分布(weights 参数)不支持权重
    安全性伪随机数,不适用于安全场景加密安全,适合密码学相关操作
    适用场景游戏、模拟、非敏感数据抽样生成密码、令牌、密钥等安全敏感操作
  • random.choices VS 循环调用random.choice

    random.choices 是批量生成(一次调用返回 n 个字符),底层由C实现,效率远高于Python层循环调用 random.choice。
    但是使用循环调用random.choice方式generate_clear_random_string更加灵活,支持自定义字母和数字。

  • generate_random_letter_and_num
    使用 ret += s 拼接字符串,每次操作需复制整个字符串,导致时间复杂度 O(n²),而其他方法用 join 一次性拼接(时间复杂度 O(n))。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值