提问人:Simon Van den Bossche 提问时间:8/23/2023 更新时间:8/23/2023 访问量:69
哈希函数 或 相等
Hash function for or equality
问:
我正在开发一个检查不完整数据的程序。
class Contact:
def __init__(self, name, phone, email):
self.names = {name} if pd.notna(name) else set()
self.phones = {parsed_phone} if (parsed_phone := _parse_phone(phone)) else set()
self.emails = {parsed_email} if (parsed_email := _parse_email(email)) else set()
def __eq__(self, other):
return (other.names & self.names) + (other.phones & self.phones) + (other.emails & self.emails) >= 1
如您所见,如果至少有 2 个数据点(姓名、电话、电子邮件)匹配,则 1 个联系人相等。 现在我想制作一个与相等函数具有相同功能的哈希函数。
例如:
a := Contact("James Smith", "+xx xxx xx xx xx", "[email protected]") == b := Contact("James Smit", "+xx xxx xx yx xx", "[email protected]")
=> hash(a) == hash(b)
和
a := Contact("James Smith", "+xx xxx xx xx xx", "[email protected]") == b := Contact("Jane Doe", "+zz zzz zz zz zz", "[email protected]")
=> hash(a) != hash(b)
哈希函数应该是什么样子的?
答:
0赞
luk2302
8/23/2023
#1
如果您从三个联系人开始,这意味着 和 但是 。这是可行的。a = Contact("J", "a", "b")
b = Contact("J", "c", "d")
c = Contact("L", "c", "e")
a == b
b == c
a != c
__eq__
基于该 which 也意味着满足 which 也意味着满足 。但结果是.请注意,这与 的任何实际实现无关,无论您在其中实现什么逻辑都不能满足您的要求。hash(a) = X
hash(b) = X
a == b
hash(c) = X
b == c
hash(a) == hash(c)
hash
hash
评论
0赞
Kelly Bundy
8/23/2023
“但是这样做的结果,hash(a) == hash(c)” - 而且?
1赞
Kelly Bundy
8/23/2023
啊,我错过了。他们不应该要求那样做。因为它完全允许具有具有相同哈希值的不相等值。
0赞
Kelly Bundy
8/23/2023
也就是说,我以为他们只是在要求一个有效的哈希函数。也就是说,相等的值必须具有相等的哈希值。
下一个:随机选择 - 加权误差
评论
name->id
phone->id
email->id
a := Contact("James Smith", "+xx xxx xx xx xx", "[email protected]") == b := Contact("Jane Doe", "+zz zzz zz zz zz", "[email protected]")
“ - 那不应该吗?!=