2010-09-24 56 views
10

我已經寫了一個類,其實施需要很長時間才能執行。我一直在考慮緩存它的散列,並將其存儲在一個像._hash這樣的變量中,因此.__hash__()方法將簡單地返回._hash。 (這將在.__init__()的末尾計算或者第一次被調用.__hash__()。)Python:是否有任何理由*不*緩存對象的散列?

我的推理是:「這個對象是不可變的 - >它的散列值永遠不會改變 - >我可以緩存散列值。

但現在讓我想到:你可以說任何可哈希對象的同樣的事情。 (除了哈希值是它們的ID的對象)

因此,有沒有理由而不是緩存對象的散列,除了散列計算非常快的小對象?

回答

8

當然,可以緩存散列值。事實上,Python本身就是爲字符串做的。權衡是在哈希計算的速度和保存哈希值所花費的空間之間進行的。這種權衡是例如爲什麼元組不會緩存他們的散列值,但字符串做(見request for enhancement #1462796)。

0

通常的原因是Python中的大多數對象都是可變的,所以如果哈希取決於屬性,只要更改屬性,它就會改變。如果你的類真的是不可變的,並且(所有進入哈希的屬性都是不變的!),那麼你可以緩存哈希。

+5

當然,如果一個對象是可變的,那麼實現'__hash__'通常是一個壞主意。 '__hash__'的唯一內建使用要求哈希值穩定。 – 2010-09-24 13:18:39

+2

不,當您更改對象的屬性時,__hash__'的默認實現不會返回任何不同的內容。因爲默認情況下,對於任何對象都是如此:'hash(obj)== id(obj)== hash(id(obj))' - 這意味着對象只需將它們的id作爲它們的哈希值。該ID是靜態的,所以你可以說對象默認「緩存」它們的散列。 – 2010-09-24 13:22:32

相關問題