2016-09-03 6 views
0

10進数のシーケンスを取得し、10進数をハッシュ値として返すには、ハッシュ関数が必要です。例えばカスタムハッシュ関数用の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]であり、そしてIはsix出力のハッシュ値を期待します[1,2,3,4,6](小範囲)のようなものになります

どのような提案もありがたいです。あなただけの数の列をハッシュしたい場合は、あなたが行うことができます

+0

私は一般的に独自のロールしないように助言し、代わりに、事実上の衝突( 'hashlib.sha256を()')持っていないことが保証のハッシュとなるだろう。 –

+0

これはあなたが望むものに強く依存します。sha256は、計算が比較的遅く、バイト入力を受け取り、バイト出力を生成する暗号ハッシュ関数です。良い非暗号化ハッシュは計算が速く、結果の値が均等に分布し、あまり多くの衝突もない。 – janbrohl

+0

このハッシュで何をするつもりですか?入力整数の範囲はどれくらいですか?入力シーケンスの典型的なサイズは?出力の範囲はどれくらい大きくなるのですか?衝突回避はどれくらい重要ですか?あなたのニーズは、完全な暗号強度の実装か、より高速で簡単なバージョンのいずれかである[フォーマット維持の暗号化](https://en.wikipedia.org/wiki/Format-preserving_encryption)の変種によって満たされるかもしれません。 –

答えて

1

:-)事前に感謝

引数タプルの(プログラムの現在の実行のために) hashを返し
def my_hash(*args): 
    return hash(args) 

hash速く、組み込み型のためによくテストされています) - しかし、これはまだ最も頻繁に大きな数です。あなたはモジュロを取ることができ、より小さな値を取得するための

よう

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

実際には、プログラムの実行間の変化をdoesntのが、均等な結果をsum配布されません

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

を使用することができますまったく。

警告:これらは、暗号学的ハッシュではありません

+0

こんにちは、@janbrohl、python2は 'hash'のような同様の機能を持っていますか? –

+0

はい([同名](https://docs.python.org/2/library/functions。html#hash)) - 異なる値を返す可能性はありますが、本質的に同じです – janbrohl

+0

ほとんどのものはPython 2.7から3.xに変更されず、*単純な*プログラムはonyの最小限の変更が必要です – janbrohl

関連する問題