2015-12-03 2 views
5

Mi stavo esercitando con l'hashing della tupla. Lì stavo lavorando su Python 2.7. Di seguito è riportato il codice:Hashing tuple in Python che causa risultati diversi in diversi sistemi

num = int(raw_input()) 
num_list = [int(x) for x in raw_input().split()] 
print(hash(tuple(num_list))) 

I risultati di codice di cui sopra in

>>> 2 
>>> 1 2 
>>> 3713081631934410656 

ma al mio PC locale in cui sto usando Python 3.4 la risposta è

>>> 1299869600 

Il codice viene accettato, ma Non sono riuscito a scoprire cosa causa i diversi risultati. È questo per diverse versioni di Python?

+0

Ho provato con molte diverse versioni 2.x di hash su macchine diverse in questo momento. Mostra lo stesso risultato. Mentre diverse versioni di python3.x mostrano un risultato diverso. –

risposta

1

hash() può restituire valori diversi per lo stesso oggetto su diversi SO, architetture, implementazioni Python e versioni Python.

È progettato per essere utilizzato solo all'interno di una singola sessione Python, non tra sessioni o macchine. Quindi non dovresti mai fare affidamento sul valore di hash() oltre questo.

Se avete bisogno di hashing che produce gli stessi risultati in tutto il mondo, in considerazione checksum come ad esempio:

  • MD5 o SHA1,
  • xxHash, che per il suo autore fornisce risultati stabili in tutta sistema operativo e l'architettura multipla, sia esso piccolo o big endian, 32/64 bit, posix o non, ecc.)
  • o con un po 'di attenzione Murmur in quanto alcune versioni possono produrre risultati diversi su architetture diverse. Ad esempio, ho sperimentato questa mano pugno durante il porting di un C Murmur2 su un'installazione IBM S390 Linux (di tutti i posti strani!). Per evitare problemi, ho terminato invece di codificare un'implementazione Python pura ma indipendente dall'architettura su quel SO piuttosto che un'implementazione C.
+1

Commento su xxHash non corretto: il risultato è stabile su più sistemi operativi e architetture diversi, sia esso piccolo o grande endian, 32/64 bit, posix o non, ecc. – Cyan

+1

@cyan hai ragione e ha l'autore di xxHash Devo ringraziare tu ++ per intervenire: ho aggiunto "con un po 'di cautela" mentre mi sono imbattuto in problemi di endianness in passato. Ad esempio, ho sperimentato questa mano a pugno durante il porting di un C Murmur su un'installazione IBM S390 Linux (di tutti i posti strani!). Per evitare problemi, ho terminato invece di codificare un'implementazione Python pura ma indipendente dall'architettura su quel SO piuttosto che un'implementazione C. –