簡體   English   中英

根據python對象的屬性生成python對象的唯一ID

[英]Generate unique ID for python object based on its attributes

有沒有辦法在python中為對象生成一個類似哈希的ID,它只基於對象的屬性值? 例如,

class test:
    def __init__(self, name):
        self.name = name

obj1 = test('a')
obj2 = test('a')

hash1 = magicHash(obj1)
hash2 = magicHash(obj2)

我正在尋找的是hash1 == hash2。 python中是否存在類似的內容? 我知道我可以測試obj1.name == obj2.name,但我正在尋找一些我可以在任何對象上使用的通用。

你的意思是這樣的? 使用特殊方法__hash__

class test:
     def __init__(self, name):
         self.name = name
     def __hash__(self):
         return hash(self.name)

>>> hash(test(10)) == hash(test(20))
False
>>> hash(test(10)) == hash(test(10))
True

要獲得獨特的比較:

要使其唯一,您可以序列化數據,然后比較序列化值以確保它完全匹配。

例:

import pickle

class C:
  i = 1
  j = 2

c1 = C()
c2 = C()
c3 = C()
c1.i = 99

unique_hash1 = pickle.dumps(c1) 
unique_hash2 = pickle.dumps(c2) 
unique_hash3 = pickle.dumps(c3) 

unique_hash1 == unique_hash2 #False
unique_hash2 == unique_hash3 #True

如果您不需要每個對象的唯一值,但大多數都是唯一的:

請注意,相同的值將始終減少到相同的哈希值,但是2個不同的值可能會減少到相同的哈希值。

你不能使用內置的hash()函數(除非你重寫__hash__

hash(c1) == hash(c2) #False
hash(c2) == hash(c3) #False <--- Wrong

或類似使用pickle序列化數據然后使用zlib.crc32。

import zlib
crc1 = zlib.crc32(pickle.dumps(c1))
crc2 = zlib.crc32(pickle.dumps(c2))
crc3 = zlib.crc32(pickle.dumps(c3))
crc1 == crc2 #False
crc2 == crc3 #True

在函數hash()構建__hash__()對象方法中有一個lool。 這些可能正是您所尋找的。 您必須為自己的類實現__hash__()

我猜

def hash_attr(ins):
 return hash(tuple(ins.__dict__.items()))

基於其屬性散列任何實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM