所以我得到了这个生成种子的函数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)
我试图扭转makeseed所做的事情,我希望它能起作用,但它没有
您的字符串编码不好。如果你对一个数字进行编码和解码,你会得到其他的东西。我将它们分成一个单独的函数并添加了一个测试。
您对操作的逆转实际上并没有逆转操作。它只是以相同的顺序执行一些相同的数学运算,而不是相反的顺序。
MY_ALPHABET = "ABCDEFGHJKLMNPQRSTWXYZ01234V6789"
def encode(seed: int) -> str:
encoded = ""
for _ in range(0, 8):
value = seed & 0x1F
seed >>= 5
encoded = MY_ALPHABET[value] + encoded
return encoded
def decode(encoded: bytes) -> int:
seed = 0
for digit in encoded:
value = MY_ALPHABET.index(digit)
seed <<= 5
seed += value
return seed
assert(99999 == decode(encode(99999)))
def getchecksum(seed: int):
checksum = 0
while True:
checksum = (checksum + (seed & 0xFF)) & 0xFF
checksum = (2 * checksum + (checksum >> 7)) & 0xFF
seed >>= 5
if seed == 0:
break
return checksum
def make_seed(seed: int):
checksum = getchecksum(seed)
seedsprev = ((seed ^ 0xFEF7FFD) << 8) | checksum
return encode(seedsprev)
def is_valid_seed(encoded: str):
seed = decode(encoded)
original_seed = (seed >> 8) ^ 0xFEF7FFD
original_encoded = make_seed(original_seed)
return original_encoded == encoded
seed = 87654321
checksum = getchecksum(seed)
encoded = make_seed(seed)
assert is_valid_seed(encoded)
assert not is_valid_seed('ABCDEFGH')