import hmac import hashlib import struct import time import base64 def generate_totp(secret, time_step=30, digits=6, current_time=None): if current_time is None: current_time = int(time.time()) # 计算时间计数器 current_time //= time_step time_bytes = struct.pack('>Q', current_time) # 解码密钥并计算HMAC secret = base64.b32decode(secret, casefold=True) hmac_result = hmac.new(secret, time_bytes, hashlib.sha1).digest() # 动态截断 offset = hmac_result[-1] & 0xF truncated_hash = hmac_result[offset : offset + 4] # 将4字节截断哈希转换为整数 otp = struct.unpack('>I', truncated_hash)[0] # 关键修正:将最高位清零,确保符合RFC规范 otp = otp & 0x7fffffff # 取模运算得到指定位数的OTP otp = otp % (10 ** digits) # 格式化OTP为字符串,不足位数前补零 otp_str = str(otp).zfill(digits) return otp_str, current_time def get_time_until_next_step(time_step=30): current_time = int(time.time()) return time_step - (current_time % time_step) # 完整示例: if __name__ == "__main__": secret_key = "2FASTEST" # 请使用更复杂的密钥 print("--- TOTP 生成器 ---") print(f"密钥: {secret_key}") print(f"时间步长: 30 秒") print(f"OTP位数: 6") while True: # 获取到下一个时间步长的等待时间 wait_time = get_time_until_next_step() print(f"\n等待 {wait_time} 秒直到下一个时间步长...") time.sleep(wait_time) # 生成TOTP current_totp, time_counter = generate_totp(secret_key, current_time=int(time.time())) print(f"当前时间戳: {int(time.time())}") print(f"时间计数器: {time_counter}") print(f"生成的TOTP: {current_totp}") 注意事项与最佳实践 在实现和部署TOTP时,除了上述核心算法修正外,还需要考虑以下几点: 法语写作助手 法语助手旗下的AI智能写作平台,支持语法、拼写自动纠错,一键改写、润色你的法语作文。
从这个版本开始,Go的工具链本身就能够识别并支持为不同的目标平台构建应用程序,无需额外的配置或复杂的编译步骤。
Go语言通过协程(goroutines)提供了优秀的并发原语。
3. 主要区别对比 特性 重载(Overloading) 重写(Overriding) 发生位置 同一类或同一作用域 基类与派生类之间 函数签名 参数列表必须不同 必须完全相同 虚函数要求 不需要virtual 必须是virtual函数 绑定时机 编译时(静态绑定) 运行时(动态绑定) 目的 提供多种接口形式 改变已有行为,实现多态 基本上就这些。
不复杂但容易忽略的是——记得先排序再搜索。
不要在遍历过程中修改原列表 在使用for循环遍历列表时,如果同时删除或添加元素,可能会导致跳过某些元素或引发意外行为。
如果它们不相等,测试就会失败。
... 2 查看详情 删除对象:$user->delete(); 批量删除:User::deleteAll(['status' => 0]); 使用 Query Builder 操作数据库 Query Builder 更适合复杂查询或不希望通过模型操作的场景。
关键点是两个环境完全隔离,避免资源竞争。
编辑 /etc/hosts:sudo nano /etc/hosts 在 127.0.0.1 localhost 行后添加您的 myhostname: PatentPal专利申请写作 AI软件来为专利申请自动生成内容 13 查看详情 127.0.0.1 localhost mail.example.com这将把 mail.example.com 解析到本地回环地址 127.0.0.1。
信号量适合控制对有限资源的访问,比如限制最大并发线程数。
混合策略:反射+缓存+函数指针 在必须使用反射的场景中,结合缓存与函数指针可大幅缓解性能问题。
被观察者维护一个观察者列表,并提供注册、注销和通知的方法。
要设计一个高效、可维护的Golang微服务系统,不仅需要合理的架构设计,还需要掌握一些关键实践技巧。
只要正确处理HTTP Range请求、设置头部、及时刷新输出,就能让PHP实现流畅的视频流传输。
优先队列:任务按优先级处理,每次取出最高优先级(最小或最大)任务。
基本上就这些。
获取文件: r.FormFile("file") 用于获取名为 "file" 的上传文件。
避免全局变量: 无需依赖全局状态或复杂的数据结构来传递信息。
当左路到底后,弹出栈顶节点并访问,然后转向其右子树,重复此过程。
本文链接:http://www.altodescuento.com/373015_3139ca.html