2016-09-03 108 views
0

我需要一個散列函數來獲取一串十進制數並返回一個十進制數作爲散列值。自定義散列函數的python庫

例如:

>> def my_simple_hash(*args): 
    return reduce(lambda x1, x2: 2*x1 + x2, args) 

>>> my_simple_hash(1,3,4) 
14 
>>> my_simple_hash(1,4,3) 
15 
>>> my_simple_hash(4,3,1) 
23 

我的問題是:

  1. 沒有Python有一個內置的lib更有效地做到這一點?
  2. 我怎麼能在相對小的範圍內輸出散列值?

問題2說明:

因爲1,3,4具有六個不同的組合如下:

1,3,4 
1,4,3 
3,1,4 
3,4,1 
4,1,3 
4,3,1 

相應的輸出是[14, 15, 18, 21, 21, 23],我期望的six輸出的散列值會像[1,2,3,4,6](小範圍)

任何意見,將不勝感激。 由於事先:-)

+0

我一般會建議不要推出自己的,並與同時幾乎保證不會有衝突的哈希('hashlib.sha256()'),而不是去。 –

+0

這很大程度上取決於你想要的 - sha256是一個密碼散列函數,計算相對較慢,需要字節輸入併產生字節輸出。良好的非密碼哈希計算速度快,結果值均勻分佈且碰撞不會太多。 – janbrohl

+0

你打算如何處理這個散列?輸入整數的範圍有多大?輸入序列的典型大小是多少?輸出的範圍應該多大?避免碰撞有多重要?您可以通過[保持格式的加密](https://en.wikipedia.org/wiki/Format-preserving_encryption)變體來滿足您的需求,它可以是完整的加密強度實現,也可以是更快,更簡單的版本。 –

回答

1

如果你只是想湊一個數列,你可以做

def my_hash(*args): 
    return hash(args) 

它返回hash(該程序的當前運行)的ARGS元組(hash對於內建類型而言是快速且經過充分測試的) - 但這仍然是一個大數目。

爲了得到一個較小的值,你可以採取像

def my_hash(*args): 
    return hash(args)%10 # or whatever number you like 

模其實你也可以使用

def my_hash(*args): 
    return sum(args)%10 # or whatever number you like 

其犯規的程序運行之間變化,但sum不平均分配結果在所有。

警告:這些都不是密碼學哈希

+0

hi,@janbrohl,python2有類似'hash'的函數嗎? –

+0

是([同名](https://docs.python.org/2/library/functions。html#hash)) - 它可能返回不同的值,但它本質上是相同的 – janbrohl

+0

大多數東西沒有改變(很多)從Python 2.7到3.x和*簡單*程序工作都需要最小的變化(或根本沒有) – janbrohl