Toon posts:

[Python] Goede __hash__-implementatie

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb (in Python) een object gemaakt wat drie strings bevat, en die wil ik in een Set stoppen, dus moet het object een goede __eq__ en __hash__ methode hebben. Dus ik had zoiets gedacht:
Python:
1
2
3
4
5
6
7
8
9
10
11
class A:
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

    def __eq__(self, other):
        return self.a == other.a and self.b == other.b and self.c == other.c

    def __hash__(self):
        return hash(self.a) + hash(self.b) + hash(self.c)

Maar helaas, dat werkt niet goed want __hash__ kan nu een getal teruggeven wat groter is dan een int, dus een long, en dat mag niet. Nu vraag ik me af, hoe maak ik nu een goede __hash__-implementatie? Ik neem aan dat de hash van objecten die volgens eq() hetzelfde zijn, ook hetzelfde moet zijn, maar anders niet.

Verwijderd

Topicstarter
Hmm .. heb nu de Tuple-implementatie van http://effbot.org/zone/python-hash.htm geprobeerd, maar daarbij krijg ik hetzelfde ..

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

Je zou gewoon het resultaat van de optelling van hashes kunnen gebruiken modulo sys.maxint...

Rustacean


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 14:58
Je kunt van alles verzinnen, natuurlijk, afhankelijk van hoe ingewikkeld je het wil maken en hoe belangrijk het is om hash collisions te vermijden. Persoonlijk zou ik niet moeilijk doen en gebruik maken van het feit dat tuples al goede equality en hash methoden hebben:
Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class A:
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

    def data(self):
        return self.a, self.b, self.c

    def __eq__(self, other):
        return self.data() == other.data()

    def __hash__(self):
        return self.data().__hash__()

Eenvoudig, overzichtelijk, en het werkt goed.

Verwijderd

Topicstarter
Dat werkt perfect, dank je! :)