哈希函数 或 相等

Hash function for or equality

提问人:Simon Van den Bossche 提问时间:8/23/2023 更新时间:8/23/2023 访问量:69

问:

我正在开发一个检查不完整数据的程序。

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)

哈希函数应该是什么样子的?

python-3.x 哈希 相等

评论

4赞 user2357112 8/23/2023
这不是一个有效的等价关系,尝试在哈希表中使用这些对象首先是没有意义的。
0赞 teapot418 8/23/2023
@KellyBundy绝对是一个有效的哈希函数,即使 OP 的非等价相等性被破坏。但是,当它把事情变成线性查找时,这相当于说“不要为此使用哈希”。
0赞 teapot418 8/23/2023
那么,对于这种查找,正确的解决方案是什么呢?我想说的是,为联系人分配唯一 ID 并按 ID 存储它们。然后制作三个单独的哈希表,并按每个部分进行查找。name->idphone->idemail->id
0赞 Kelly Bundy 8/23/2023
"a := Contact("James Smith", "+xx xxx xx xx xx", "[email protected]") == b := Contact("Jane Doe", "+zz zzz zz zz zz", "[email protected]")“ - 那不应该吗?!=

答:

0赞 luk2302 8/23/2023 #1

如果您从三个联系人开始,这意味着 和 但是 。这是可行的。a = Contact("J", "a", "b")b = Contact("J", "c", "d")c = Contact("L", "c", "e")a == bb == ca != c__eq__

基于该 which 也意味着满足 which 也意味着满足 。但结果是.请注意,这与 的任何实际实现无关,无论您在其中实现什么逻辑都不能满足您的要求。hash(a) = Xhash(b) = Xa == bhash(c) = Xb == chash(a) == hash(c)hashhash

评论

0赞 Kelly Bundy 8/23/2023
“但是这样做的结果,hash(a) == hash(c)” - 而且?
1赞 Kelly Bundy 8/23/2023
啊,我错过了。他们不应该要求那样做。因为它完全允许具有具有相同哈希值的不相等值。
0赞 Kelly Bundy 8/23/2023
也就是说,我以为他们只是在要求一个有效的哈希函数。也就是说,相等的值必须具有相等的哈希值。