我有一个班级Entry
:
class Entry:
def __init__(self, title, content, kw):
self.title = title
self.content = content
self.kw = kw
我正在尝试为可以存储在SQL数据库中的Entry
对象生成唯一的整数标识符。我追求的行为如下:如果Entry
,a
和b
这两个对象的值相同
self.title, self.content, self.kw
个字段,它们将具有相同的ID。否则,他们计算到不同的ID。
我了解id(e)
提供此功能。但是,它只能持续使用对象的生命周期。因此,如果我多次执行一个程序,那么在每次执行程序时,实例化具有完全相同字段值的Entry
(例如e = Entry(title='Hello', content='Hello world', kw='apples')
,id(e)
可以产生不同的值时间。
我希望对象的id在这些多个程序执行中保持相同。如何在python中获得此功能?
谢谢!
更新: 我发现我实际上可以在多个上设置一个唯一约束 因此,我可以确保一个SQL表的列,标题,内容和kw 是独特的。但是,内容是一个TEXT字段,所以我觉得这可以 效率很低。因此,任何可以计算唯一性的答案 在python中欢迎!
答案 0 :(得分:0)
您可以使用哈希:
import hashlib
class Entry:
# other code
def __hash__(self):
data = "{}{}{}".format(self.title, self.content, self.kw)
# return hash(data)
return int.from_bytes(hashlib.blake2b(data.encode()).digest(), "big")
然后比较对象的哈希值:
a, b = Entry(stuff1), Entry(stuff2)
if hash(a) != hash(b):
print("Not equal!")
如果你真的非常关心哈希冲突,这实际上是非常罕见的(例如,谷歌使用庞大的CPU和GPU集群在SHA-1中找到一个单独的冲突,花了110 years of GPU computation),你可以使用BLAKE2b,它现在没有任何碰撞弱点,比MD5 faster,以及SHA-1和SHA-2哈希值。
在我看来,你也可以使用Python的内置hash
,碰撞的可能性相对较小,因为这些非常罕见。 Python在词典和hash
中使用set
。你见过字典中的碰撞吗? (不是说这是不可能的;它只是非常罕见)。因此,只有当您的程序用户可能有意搜索时,您才应该担心冲突。