python - 为什么我的两个 python 字符串在程序中不相等,但在解释器中相等?

标签 python string hash equality

我正在尝试使用 python 编写一个聊天服务器。我使用 SHA1 哈希来验证用户,并将用户存储的哈希与给定密码的哈希进行比较,如果它们相同,那么我应该验证用户。

我的哈希函数如下所示:

def sha1_encode(string):
    import hashlib
    return hashlib.sha1(bytes(string)).hexdigest()

我的验证用户如下所示:

def validate_user(self, user, password):
    if user in self.users:
        print "user exists"
        #Get the saved SHA1 hash and see if it matches the hash of the given
        #password
        print "sha", sha1_encode(password)
        print "stored", self.users[user]
        print "equal", self.users[user] == sha1_encode(password)
        print type(self.users[user])
        print type(sha1_encode(password))
        if str(self.users[user]) == str(sha1_encode(password)):
            print "validate loop entered"
            return True
    else:
        return False

当我与列表中的用户一起运行此命令时,我得到以下输出:

user exists
sha 61503cfe0803f3a3b964b46a405f7828fd72b1f7
stored 61503cfe0803f3a3b964b46a405f7828fd72b1f7

equal False
<type 'str'>
<type 'str'>

所以我知道它们都是字符串,并且我知道它们是同一件事,但由于某种原因返回 false。我最初质疑这些对象是不同类型的,但事实似乎并非如此。

然后我尝试将这些字符串复制到解释器中并检查它们是否实际上相等:

In [1]: x = '61503cfe0803f3a3b964b46a405f7828fd72b1f7'

In [2]: y = '61503cfe0803f3a3b964b46a405f7828fd72b1f7'

In [3]: x == y 
Out[3]: True

此时我很困惑为什么它没有在函数中报告 true 而在解释器中报告 true,特别是因为我似乎只是使用不同的变量名称在做同样的事情。谁能向我解释一下发生了什么事吗?任何帮助将不胜感激。

最佳答案

只是在这里尝试一下,但根据您的输出,您存储的密码列表中可能有一个尾随“\n”,因此输出中后面有一个空行

print "stored", self.users[user]

你可以试试

print "equal", self.users[user].strip() == sha1_encode(password)

看看这是否可以解决您的问题。该调用将删除尾随字符。

关于python - 为什么我的两个 python 字符串在程序中不相等,但在解释器中相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36208446/

相关文章:

python - 如何更新事件驱动的情节?

python - 正则表达式捕获在 python 中使用私有(private)成员的代码,除非它是函数 def

c - 字符串的快速移动字符

c++ - MD5 和 SHA1 C++ 哈希库

python - 使用 SQLAlchemy ORM 批量插入多个表

python 3 configparser.read() 在给定不存在的文件时不会引发异常

javascript - 您可以将自定义变量传递到 Google Analytics 事件跟踪中吗?

c# - 如何从 IP 地址字符串中删除端口号

Java HashMap 内容

c# - 带盐的 MD5 散列用于在 C# 中将密码保存在数据库中