Hashing雜湊注意事項

wujianming_110117發表於2020-12-27

Hashing雜湊注意事項
Numba支援內建功能hash(),只需__hash__()在提供的引數上呼叫成員函式即可 。這使得新增對新型別的雜湊支援變得微不足道,這是因為擴充套件APIoverload_method()裝飾器的應用程式,需要過載用於為註冊到該型別的__hash__()方法的新型別,計算雜湊值的函式。例如:
from numba.extending import overload_method

@overload_method(myType, ‘hash’)
def myType_hash_overload(obj):
# implementation details
實施
Numba雜湊函式的實現,嚴格遵循Python 3的實現。唯一的例外是,對於Unicode和位元組(內容長於sys.hash_info.cutoff)進行雜湊,唯一受支援的演算法是 siphash24(CPython 3中的預設值)。結果,預設條件下,Numba將為所有受支援的型別匹配Python 3雜湊值。
Unicode雜湊快取差異
Numba和CPython Unicode字串內部表示形式都有一個hash 成員,用於快取字串的雜湊值。總是在計算雜湊值之前檢查該成員,並且僅從快取中提供一個值就可以了,因為這樣做便宜得多。Numba Unicode字串雜湊快取實現的行為與CPython的行為類似。唯一值得注意的行為更改(其唯一影響是效能的潛在變化)是,Numba始終計算並快取在將其load,在Python中重用時建立的Unicode字串的雜湊,與CPython相比,這在某些情況下太快了。CPython可能會延遲根據建立方法對新Unicode字串進行雜湊處理的時間。還應注意,Numba在Unicode字串複製nopython modehash 的CPython內部表示形式的成員時,將其拆分成其自己的表示形式,不重新計算已經具有與之關聯的雜湊值的字串的雜湊。
PYTHONHASHSEED的Accommodation
PYTHONHASHSEED環境變數可用於後續的CPython的雜湊演算法。例如,Numba雜湊實現直接讀取CPython雜湊演算法的內部狀態,結果,在Numba的雜湊實現中,PYTHONHASHSEED複製了。

相關文章