列表做成哈希来比较生成的PIN码?

List made into a hash to compare generated pin code?

提问人: 提问时间:9/11/2018 最后编辑:Martijn Pieters 更新时间:9/11/2018 访问量:343

问:

我正在制作一个游戏,你可以破解密码。我想要它,所以它可以是从 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')

问题是当我输入该代码时,它不起作用,因为没有任何内容作为输出出来。有没有办法将这 4 个数字组合起来进行哈希或任何名称?

python 列表 哈希 相等

评论

0赞 Günther Jena 9/11/2018
PIN 是数字列表
0赞 Stop harming Monica 9/11/2018
hash(tuple(pin))?但我看不出这与你的麻烦有什么关系。

答:

0赞 Günther Jena 9/11/2018 #1

要获得四位数的 int,请使用:

pin = randint(0, 9999)

因此,生成的代码将是:

from random import *
from time import sleep
pin = randint(0, 9999)
print('%04d'%pin)  # print with leading zeros
usrinp = int(input(''))
if usrinp == pin:
  print('cracked')
5赞 Martijn Pieters 9/11/2018 #2

您有一个整数列表,并且正在将其与单个整数进行比较。这行不通,原因有二:

  • 无论内容如何,单个整数永远不会等于列表
  • int()不保留主角; 返回 ,返回 。0int('0999')999int('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

然后针对该引脚测试该值:input()

usrinp = input('')
if usrinp == pin:
    # ...

注意:你也可以选择一个随机整数,用 ,但这会让你更难告诉玩家他们是否得到了一些正确的数字。例如,通过生成字符串,您可以简单地计算它们正确了多少位: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!')

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

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

userinp = [int(digit) for digit in input('')]

但是,除非您还计划在算术中使用数字(对它们求和、乘法等),否则这种方法与使用字符串相比没有真正的优势。列表和字符串都是序列,但生成字符串可以使您不必处理每次玩游戏时都顽固地输入并破坏转换的用户。:-)'Your mamma is a <censored>'int()

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

评论

0赞 Cendre 9/11/2018
也许用 ?pin = randint(999,10000)
3赞 Martijn Pieters 9/11/2018
@Cendre:那么你不能有一个前导零位。 也是一个有效的PIN码!0000
0赞 Cendre 9/11/2018
虽然针脚很弱,但足够公平:)
0赞 Farhan.K 9/11/2018
@Cendre 随机猜出 0000 和不同的 4 位数字的概率是一样的。
0赞 Martijn Pieters 9/11/2018
@Farhan.K:人类在尝试之前尝试的概率要高得多。我们在这里谈论的是人类的猜测,而不是自动脚本。编写破解程序的程序员刚开始生成引脚代码的概率也高于使用随机分布进行猜测的概率。:-)000074520000
1赞 Suraj Pal 9/11/2018 #3

这是因为您正在将整数值与列表进行比较。

import random
from time import sleep
pin = 1000*randint(0, 9) + 100*randint(0, 9) + 10*randint(0, 9) + randint(0, 9)
print(pin)
usrinp = int(input(''))
if usrinp == pin:
  print('cracked')

如果您的 PIN 始终是 4 位数字,这应该有效,而不是带有前导零的 PIN。

评论

0赞 dangee1705 9/11/2018
pin = 1000*randint(0, 9) + 100*randint(0, 9) + 10*randint(0, 9) + randint(0, 9)这和pin = randint(0, 9999)
1赞 Cendre 9/11/2018
不,这和我想象的一样,例如,使用您的代码,您可以有 5 个pin = randint(999,10000)
0赞 dangee1705 9/11/2018
@Cendre 1000 * 9 + 100 * 9 + 10 * 9 + 1 * 9 = 9999