哈希方法实现无法沿set()工作[Python]
我在一个对象中实现一个散列函数,并使用用户名散列值作为该对象的散列值,即:哈希方法实现无法沿set()工作[Python],python,python-3.x,object,hash,set,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("
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
成员使用\uuuuuuuuuuuuuuu()
,但是如果两个对象具有相同的散列,则set
将使用\uuuuuuuuuuuuuueq()
方法来确定它们是否相等。最终,set
保证没有两个元素是相等的,而不是没有两个元素具有相等的哈希值。散列值用作第一次传递,因为它的计算成本通常低于相等值
为什么?
不能保证具有相同散列的任何两个对象实际上相等。想想你的“DiscordUser”中有“自我”这个名字的无限价值。Python使用siphash散列'str'值。Siphash的范围有限,因此冲突必须是可能的
使用可变值作为hash()
的输入时要小心。对象的哈希值在其生存期内应相同
看看这篇文章,了解一些关于Python中set
s、散列和平等性测试的好信息
编辑:根据问题中显示的所有代码,
用户
仅在脚本末尾的用户集
中,如果用户在用户集中:,则在脚本末尾的用户集
中,Python用于str
值。在这种情况下,第一个if分支永远无法执行。也许有一些代码缺失,这说明了您的实际问题。