列表制作成哈希比较生成的密码?

2 python hash equality list

我正在制作一个破解代码的游戏.我想要它所以它可以是从0000到9999的任何代码.我制作了这个脚本.

from random import *
from time import sleep
pin = [randint(0,9),randint(0,9),randint(0,9),randint(0,9)]
print(pin)
usrinp = int(input(''))
if int(usrinp) == pin:
  print('cracked')
Run Code Online (Sandbox Code Playgroud)

问题是,当我输入该代码时,它不起作用,因为没有任何东西作为输出.有没有办法将这4个数字组合成哈希或其所谓的?

Mar*_*ers 5

你有一个整数列表,并将它与一个整数进行比较.这不起作用有两个原因:

  • 无论内容如何,​​单个整数永远不会等于列表
  • int()不保留主角0; int('0999')返回999,int('0000')返回0.

将您的输入和秘密保持为字符串,这样您就可以保持领先0.使它们都是相同的类型,因此生成一个字符串,而不是整数列表.

您可以通过选择字符串数字生成您的密钥:

digits = '0123456789'  # or use from string import digits

pin = ''.join([random.choice(digits) for _ in range(4)])  # 4 random digits, one string
Run Code Online (Sandbox Code Playgroud)

然后input()根据该引脚测试该值:

usrinp = input('')
if usrinp == pin:
    # ...
Run Code Online (Sandbox Code Playgroud)

注意:您也可以选择一个随机整数random.randint(0, 9999),但这会让您更难以告诉玩家他们是否有一些正确的数字.例如,通过生成字符串,您可以简单地计算它们具有的正确位数:

if usrinp == pin:
    print('Cracked!')
else:
    correct_count = 0
    for pindigit, userdigit in zip(pin, usrinp):
        if pindigit == userdigit:
            correct_count += 1
    print('Sorry, not the right pin, but you guessed",
          correct_count, 'digits correctly!')
Run Code Online (Sandbox Code Playgroud)

您可以使用两个整数来实现相同的功能,但是您必须使用数学或字符串转换来提取每个数字并正确处理前导零的值.这一切都变得更加复杂.

另一种方法是将用户输入转换为单独的整数(因此保留原始生成的整数列表):

userinp = [int(digit) for digit in input('')]
Run Code Online (Sandbox Code Playgroud)

但除非你还打算使用算术中的数字(求和,乘法等),否则这种方法在使用字符串方面没有任何优势.列表和字符串都是序列,但生成字符串使您无需处理'Your mamma is a <censored>'每次玩游戏时顽固输入并打破int()转换的用户.:-)

这些都不需要散列 ; 哈希在这里没有用,因为你想测试相等性,而不是试图将大量潜在值减少到一组有限的选项(比如试图将任意值放入有限大小的表中,或者指向一个大的到可以处理这些连接的有限数量的服务器的传入连接数.

  • @Cendre:那么你不可能拥有领先的零数字.'0000`也是一个有效的PIN码! (3认同)