Генерируйте уникальный идентификатор для Python, основанного на объектах на его атрибутах

Я получал ту же проблему как Вы, однако мой опыт немного отличался.

я нахожусь на перспективе x64, мои разработчики находятся в xp x64... у них не было проблем вообще. Я просто обновил и не мог выполнить модульный тест на проект MVC asp.net. Я получал те же 500 ошибок, которые Вы получали.

я выключил покрытие кода, все волшебно начало работать.

9
задан Nadia Alramli 24 August 2009 в 23:18
поделиться

4 ответа

Вы имеете в виду что-то вроде этого? Используя специальный метод __ 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
6
ответ дан 4 December 2019 в 15:22
поделиться

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

2
ответ дан 4 December 2019 в 15:22
поделиться

Думаю,

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

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

2
ответ дан 4 December 2019 в 15:22
поделиться

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

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

Пример:

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

Если вы не используете Не нужны уникальные значения для каждого объекта, но в основном уникальные:

Обратите внимание, что одно и то же значение всегда будет уменьшаться до одного и того же хэша, но два разных значения могут быть уменьшены до одного и того же хэша.

Вы не можете использовать что-то вроде встроенной функции 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
3
ответ дан 4 December 2019 в 15:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: