Qual é o padrão __hash__ em python?

Frequentemente estou usando coisas interessantes como chaves para dicionários e, portanto, estou me perguntando qual é o caminho certo para fazê-lo - e isso passa pela implementação de bons métodos de hash para meus objetos. Estou ciente de outras perguntas aqui comoboa maneira de implementarjogo da velha, mas eu gostaria de entender como o padrão__hash__ funciona para objetos personalizados, e se é possível confiar nele.

Tenho notado que os mutáveis ​​são explicitamente indecifráveishash({}) gera um erro ... mas, estranhamente, classes customizadas são hashable:

>>> class Object(object): pass
>>> o = Object()
>>> hash(o)

Então, alguém sabe como funciona essa função hash padrão? Compreendendo isso, gostaria de saber:

Posso confiar neste hash padrão, se eu colocar objetos de um mesmo tipo como chaves de um dicionário? por exemplo. :

key1 = MyObject()
key2 = MyObject()
key3 = MyObject()
{key1: 1, key2: 'blabla', key3: 456}

Posso confiar nele se usar objetos de tipos diferentes como chaves em um dicionário? por exemplo.

{int: 123, MyObject(10): 'bla', 'plo': 890}

E no último caso também, como garantir que meus hashes personalizados não entrem em conflito com os hashes internos? por exemplo :

{int: 123, MyObject(10): 'bla', MyObjectWithCustomHash(123): 890}

questionAnswers(6)

yourAnswerToTheQuestion