python - 哈希方法实现无法与 set() 一起工作 [Python]

标签 python python-3.x object hash set

我正在一个对象中实现哈希函数,并且我使用用户名哈希值作为该对象的哈希值,即:

class DiscordUser:
    def __init__(self, username):
        self.username = username

    def __hash__(self):
        return hash(self.username)

将此类对象添加到哈希集并将它们与作为构造函数输入的完全相同的用户名进行比较时,就会出现问题,即:

user = DiscordUser("Username#123")

if user in users_set:
    # user is already in my users_set, such condition is NEVER MET, dont understand why

else:
    # add user to users_set, this condition is met ALWAYS
    users_set.add(user)

为什么哈希函数不能正常工作,或者我在这里做错了什么?

最佳答案

哈希函数正常工作,set成员资格使用__hash__(),但如果两个对象具有相同的哈希,set将使用__eq__() 方法来确定它们是否相等。最终,set 保证没有两个元素相等,而不是没有两个元素具有相等的哈希值。哈希值被用作第一遍,因为它的计算成本通常比相等性要低。

为什么?

无法保证任何两个具有相同哈希值的对象实际上是相等的。考虑一下“DiscordUser”中的“self.name”有无限值。 Python 使用 siphash 对“str”值进行哈希处理。 Siphash 的范围是有限的,因此必然有可能发生冲突。

使用可变值作为 hash() 的输入时要小心。对象的哈希值在其生命周期内应该是相同的。

看看这个 answer有关 Python 中的集合、散列和相等测试的一些不错的信息。


编辑:Python 使用 siphash对于 3.4 以后的 str

关于python - 哈希方法实现无法与 set() 一起工作 [Python],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66728607/

相关文章:

python - AWS Lambda 导入模块失败

python-3.x - 如何裁剪无人机捕获的太阳能电池板?

python - 关于Python中定义函数的问题

java - 为什么java中原始数据类型不用对象来表示?

python - Celery 中的异常处理?

python - Pandas:包含变量名称和值的多列:如何使用 Pivot?

javascript - 如何获取对象的方法?

javascript - 转换/解析 javascript 对象键值对

python - 错误 : "You are trying to add a non-nullable field"

python-3.x - 如何用一个字符替换字符串中的所有字符