具有相同数据字段的对象的唯一标识符,该标识符在多个程序执行中持续存在

时间:2018-03-11 15:52:32

标签: python uniqueidentifier

我有一个班级Entry

class Entry:
  def __init__(self, title, content, kw): 
    self.title = title                                
    self.content = content                            
    self.kw = kw                                      

我正在尝试为可以存储在SQL数据库中的Entry对象生成唯一的整数标识符。我追求的行为如下:如果Entryab这两个对象的值相同 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中欢迎!

1 个答案:

答案 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。你见过字典中的碰撞吗? (不是说这是不可能的;它只是非常罕见)。因此,只有当您的程序用户可能有意搜索时,您才应该担心冲突。