用于忽略排序的项集合的哈希函数

2024-09-29 08:29:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用^{}函数来获取对象的哈希值,该值包含两个整数和两个字符串。此外,我有一个字典,我在其中存储这些对象;过程是我检查对象是否存在哈希值,如果存在,则更新如果没有,则插入新的对象。在

问题是,当创建对象时,我不知道对象变量的顺序,我希望将对象视为相同的,而不管这些变量的顺序如何。在

除了hash()函数,是否还有一个不考虑变量顺序的替代函数?在

#Consequently what I want is:
hash((int1,str1,int2,str2)) == hash((int2,str2,int1,str1)) 

Tags: 对象函数字符串字典顺序过程整数hash
2条回答

通常对于这样的事情,如果你发布一些示例代码,它会有不可估量的帮助,但我假设你有这样的东西:

class Foo():
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __hash__(self):
        return hash((self.x, self.y))

你在那里取一个元组的散列值,它确实关心顺序。如果希望哈希不关心整数的顺序,那么只需使用frozenset

^{pr2}$

可以使用^{}代替元组:

>>> hash(frozenset([1, 2, 'a', 'b']))
1190978740469805404
>>>
>>> hash(frozenset([1, 'a', 2, 'b']))
1190978740469805404
>>>
>>> hash(frozenset(['a', 2, 'b', 1]))
1190978740469805404

但是,从iterable中删除重复项会带来一个微妙的问题:

^{pr2}$

可以通过使用^{}从iterable创建一个计数器,并对计数器的项调用frozenset,从而保留原始iterable中每个项的计数:

>>> from collections import Counter
>>>
>>> hash(frozenset(Counter([1,2,1]).items())) 
-307001354391131208
>>> hash(frozenset(Counter([1,1,2]).items()))
-307001354391131208
>>> 
>>> hash(frozenset(Counter([1,2,1]).items())) == hash(frozenset(Counter([1,2,2]).items()))
False

相关问题 更多 >