Cevapların çoğu bunun farklı platformlardan kaynaklandığını öne sürüyor, ancak daha fazlası var. Gönderen belgelenmesiobject.__hash__(self)
:
Varsayılan __hash__()
olarak str
, bytes
ve
datetime
nesnelerinin değerleri tahmin edilemeyen rastgele bir değerle "tuzlanmıştır". Tek bir Python sürecinde sabit kalmalarına rağmen, Python'un tekrarlanan çağrıları arasında tahmin edilemezler.
Bu, bir dikte yerleştirmenin en kötü durum performansını, O (n²) karmaşıklığını kullanan, dikkatle seçilmiş girdilerin neden olduğu bir hizmet reddine karşı koruma sağlamayı amaçlamaktadır. Ayrıntılar için
http://www.ocert.org/advisories/ocert-2011-003.html adresine bakın.
Karma değerlerini değiştirme yineleme sırasını etkiler dicts
, sets
ve diğer eşleştirmeleri. Python, bu sıralama hakkında hiçbir zaman garanti vermemiştir (ve genellikle 32 bit ve 64 bit yapılar arasında değişir).
Aynı makinede çalıştırmak bile çağrılarda farklı sonuçlar verecektir:
$ python -c "print(hash('http://stackoverflow.com'))"
-3455286212422042986
$ python -c "print(hash('http://stackoverflow.com'))"
-6940441840934557333
Süre:
$ python -c "print(hash((1,2,3)))"
2528502973977326415
$ python -c "print(hash((1,2,3)))"
2528502973977326415
Ayrıca ortam değişkenine bakın PYTHONHASHSEED
:
Bu değişken ayarlanmazsa veya ayarlanmazsa , ve nesnelerinin random
karmalarını tohumlamak için rastgele bir değer kullanılır .str
bytes
datetime
Bir PYTHONHASHSEED
tamsayı değerine ayarlanırsa hash()
, karma randomizasyon tarafından kapsanan türlerin oluşturulması için sabit bir çekirdek olarak kullanılır .
Amacı, yorumlayıcının kendisi için kendi kendine testler gibi tekrarlanabilir hashinglere izin vermek veya bir python işlemi kümesinin karma değerleri paylaşmasına izin vermektir.
Tam sayı, aralıktaki bir ondalık sayı olmalıdır [0, 4294967295]
. Değerin belirtilmesi, 0
hash randomizasyonu devre dışı bırakacaktır.
Örneğin:
$ export PYTHONHASHSEED=0
$ python -c "print(hash('http://stackoverflow.com'))"
-5843046192888932305
$ python -c "print(hash('http://stackoverflow.com'))"
-5843046192888932305