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

时间:2016-03-24 19:25:10

标签: 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,特别是因为我似乎只是使用不同的变量名称做同样的事情。任何人都可以向我解释发生了什么事吗?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

只是在这里采取刺,但根据你的输出,你的存储密码列表中可能会有一个尾随'\ n',因此输出后的空白行

print "stored", self.users[user]

你可以尝试

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

看看是否能解决您的问题。该呼叫将删除尾随字符。