2014-10-09 53 views
1

我想根據函數的參數生成散列(對於某些快速自動緩存)。散列應該在不同的會話之間保持一致。跨不同會話散列python函數

假設我有以下功能:

def generate_hash(dictionary): 
    return hashlib.sha224(str(dictionary.items())).hexdigest() 

def foo(a,b,c): 
return generate_hash(locals()) 

這是完全正常的,只要參數str表示是在會話之間是一致的。問題是我經常把函數作爲參數傳遞,看起來好像不是。

例如,以下調用會在會話中返回不同的結果。

foo(1,2,np.sum) 

任何解決方法?

+0

你說的哈希的是什麼意思?我不知道Python的哈希庫的細節,但可以散列任何長度和數量的任何二進制數據。 – Linuxios 2014-10-09 16:10:51

+0

沒有解釋清楚。看看我剛剛添加的示例。 – memecs 2014-10-09 16:14:02

+0

如果你調用hash內建函數會發生什麼?我知道文檔說它計算一個對象的散列,但該對象可能是參數的一個元組 – 2014-10-09 16:21:11

回答

0

好像我想通出來的東西自己:

16 def generate_hash(dictionary): 
17 args = [] 
18 for key,item in dictionary.iteritems(): 
19  if isinstance(item,functools.partial): 
20  args.append((key,item.func.__module__,item.func.__name__,             
21   generate_hash(item.keywords))) 
22  elif inspect.isfunction(item): 
23  args.append((key,item.__module__,item.__name__)) 
24  else: 
25  args.append((key,item)) 
26 return hashlib.sha224(str(args)).hexdigest() 

這也與部分功能的工作原理consistenly:

foo('a','1',np.average)       -> 1631c5fd0050fd01cb7a7ee9666d366b35c1415cb4181c7220ead043 
foo('a',1,functools.partial(np.average,axis=0)) -> 692227d3b52b0cdcd4ed2204650cb207c1ab6f274a09977c711d35d5                
foo('a',1,functools.partial(np.average,axis=1)) -> ba1e0b01f2e12ef1c9ca2e3bf5235aaadcbe4ab29d9c977e1ee6e799 
+0

我正要發佈類似的東西。不過,我想補充一點,你應該在你的散列中包含'.__ module__'屬性。這會使你很難看到碰撞(你的例子,'np.sum',會和內建的'sum'碰撞)。 – Wilduck 2014-10-09 16:47:42

+0

剛更新考慮模塊。感謝您的輸入! – memecs 2014-10-09 16:51:09

+0

作爲一個說明,這是一個脆弱的實現,我不會指望長期存儲。例如,如果您更新numpy,它可能會破壞緩存。但是,如果你需要一些能夠在短期內發揮作用的東西,那麼這可能會好起來的。 – Wilduck 2014-10-09 16:53:04