Python种子验证函数失效求助:is_valid_seed无法验证makeseed生成的种子
种子验证函数失效问题排查
我实现了生成种子的makeseed()函数,现在需要编写验证种子合法性的is_valid_seed()函数,但测试时无法验证由makeseed()生成的种子,代码如下:
import random def getchecksum(seed): checksum = 0 while True: checksum = (checksum + (seed & 0xFF)) & 0xFF checksum = (2 * checksum + (checksum >> 7)) & 0xFF seed >>= 5 if seed == 0: break return checksum def makeseed(): seed = random.randint(1, 4294967295) checksum = getchecksum(seed) abc = "ABCDEFGHJKLMNPQRSTWXYZ01234V6789" seedsprev = ((seed ^ 0xFEF7FFD) << 8) | checksum finalseed = "" for loopindex in range(0, 8): finalseed = abc[seedsprev & 0x1F] + finalseed seedsprev >>= 5 return finalseed def is_valid_seed(seed): """ Checks if a seed is valid. Args: seed: The seed to check. Returns: True if the seed is valid, False otherwise. """ seed_length = len(seed) if seed_length != 8: return False abc = "ABCDEFGHJKLMNPQRSTWXYZ01234V6789" try: seed_int = 0 for i in range(7, -1, -1): seed_int <<= 5 seed_int |= abc.index(seed[i]) checksum = getchecksum(seed_int) seed_int = ((seed_int ^ 0xFEF7FFD) << 8) | checksum final_seed = "" for _ in range(8): final_seed = abc[seed_int & 0x1F] + final_seed seed_int >>= 5 return final_seed == seed except ValueError: return False ok = makeseed() print(is_valid_seed(ok)) #to check if the function is correct print(ok)
问题原因
你的is_valid_seed()逻辑完全颠倒了生成流程:
- 在
makeseed()中,流程是原始seed → 计算校验和 → 生成seedsprev → 转成字符种子 - 但验证函数里,把输入种子解码得到的
seed_int(对应makeseed()的seedsprev)当成了原始seed,错误地重新计算校验和并生成新种子,这必然和输入不匹配。
修正方案
正确的验证逻辑应该反向拆解生成流程:
- 验证输入长度为8,且所有字符都在指定字符集内
- 将字符种子解码为
seedsprev - 从
seedsprev中拆分出存储的校验和(低8位)和异或后的原始seed(高24位右移8位) - 还原原始seed:异或后的值 ^ 0xFEF7FFD
- 计算原始seed的校验和,和拆分出的校验和对比,一致则种子有效
修正后的is_valid_seed()函数:
def is_valid_seed(seed): """ Checks if a seed is valid. Args: seed: The seed to check. Returns: True if the seed is valid, False otherwise. """ if len(seed) != 8: return False abc = "ABCDEFGHJKLMNPQRSTWXYZ01234V6789" seedsprev = 0 try: # 将字符种子解码为seedsprev(对应makeseed里的seedsprev) for char in seed: seedsprev = (seedsprev << 5) | abc.index(char) except ValueError: # 存在不在字符集里的字符 return False # 拆分校验和(低8位)和异或后的原始seed(高24位) stored_checksum = seedsprev & 0xFF xor_seed = (seedsprev >> 8) & 0xFFFFFF # 还原原始seed original_seed = xor_seed ^ 0xFEF7FFD # 计算原始seed的校验和,和存储的对比 calculated_checksum = getchecksum(original_seed) return calculated_checksum == stored_checksum
测试验证
替换修正后的函数后,运行代码会输出True和对应的种子,说明验证有效。
内容的提问来源于stack exchange,提问作者jutyve
相关产品推荐
相关产品推荐

