Генерация уникального идентификатора для объекта Python на основе его атрибутов - PullRequest
9 голосов
/ 25 августа 2009

Есть ли способ сгенерировать хеш-подобный идентификатор для объектов в Python, который основан исключительно на значениях атрибутов объектов? Например,

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, но я ищу что-то общее, что можно использовать для любого объекта.

Ответы [ 4 ]

6 голосов
/ 25 августа 2009

Ты имеешь в виду что-то подобное? Используя специальный метод __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
3 голосов
/ 25 августа 2009

Чтобы получить уникальное сравнение:

Чтобы быть уникальным, вы можете сериализовать данные, а затем сравнить сериализованное значение, чтобы убедиться, что оно точно соответствует.

Пример:

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
2 голосов
/ 25 августа 2009

Я думаю

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

хэширует любой экземпляр на основе его атрибутов.

2 голосов
/ 25 августа 2009

Иметь lool в встроенной функции hash () и объектном методе __hash__() . Это может быть именно то, что вы ищете. Вам придется реализовать __hash__() для своих собственных классов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...