2012-01-25 6 views
2

私は(3)md5sumを1つのハッシュに結合する必要があります。新しいハッシュは32文字ですが、大文字と小文字が区別され、任意の文字または数字を使用できます。これをPythonで行う最良の方法は何ですか?(3)32文字の16進数ハッシュを1つの一意の32文字ハッシュに結合しますか?

+0

を3つのハッシュ順序集合、または順不同設定されていますか?言い換えれば、H(a、b、c)== H(b、c、a)同じハッシュ値を生成すべきでしょうか? – wildplasser

+2

「ユニーク」については忘れてください。あなたは96文字を32文字に絞ろうとしています。あなたが望むことができる最高のものは、「天文学的に衝突しそうにありません」です。 –

+2

@マークランソム:まあ、それより少し良いです。彼は16文字から62文字に移動しているので、384ビットを〜190.5に圧縮しようとしています。 – DSM

答えて

3

私はcombinindからmd5ハッシュを1つのハッシュに変換します。

>>> import base64 
>>> base64.b64encode(combined.digest()) 
'PeFC3irNFx8fuzwjAz+fE/up9cz6xujs2Z06IH2GdUM=' 

したい場合:

>>> import hashlib 
>>> combined = hashlib.sha256() 
>>> combined.update(hashlib.md5('test1').digest()) 
>>> combined.update(hashlib.md5('test2').digest()) 
>>> combined.update(hashlib.md5('test3').digest()) 

は、その後、あなたが文字、数字、およびいくつかの余分な記号を使用してそれをエンコードするためにBASE64を使用することができます:それは最終的にはより多くのバイトが含まれていますので、あなたは、SHA256を使用することができますちょうど32文字、オフスライスの最後のビット:

>>> base64.b64encode(combined.digest())[:32] 
'PeFC3irNFx8fuzwjAz+fE/up9cz6xujs' 

これはあなたのOPのsuggeなどの文字と数字のほかに+/を含めることができますsts。あなたがそれらを交換したい場合は、b64encodeに2つ目のパラメータを使用することができます。

>>> base64.b64encode(combined.digest(), altchars="AA")[:32] 
'PeFC3irNFx8fuzwjAzAfEAup9cz6xujs' 
+0

+と/は使用できません。英数字で区別する必要があります。 +と/を削除できますか? – ensnare

+0

それらを削除するように更新 – jterrace

+0

最初の32バイトにパディングを持たないように、96文字は常に十分なデータになりますか? (等号=) – tMC

2

最も簡単な方法は、3つの合計を1つの96文字の文字列に結合し、その上でMD5ハッシュを実行することです。

+0

OPは結果が*すべての文字と数字であることを指示します。大文字と小文字は区別されます。結果は32文字の16進数になります。 – jterrace

1
>>> from hashlib import md5 
>>> import base64 
>>> hashes = [md5(str(i)).hexdigest() for i in range(3)] 
>>> hashes 
['cfcd208495d565ef66e7dff9f98764da', 'c4ca4238a0b923820dcc509a6f75849b', 'c81e728d9d4c2f636f067f89cc14862c'] 
>>> base64.b64encode(md5(''.join(hashes)).hexdigest())[:32] 
'YTg2N2M3N2U0Mzg2YjY1YWY4NzYzOWZh' 
+0

たので、OPが望むだろうかわかりませんでした+と/ charを含めることができます。あなたはそれが使用する2つの、余分な文字を変更することができます。 http://docs.python.org/library/base64.html – tMC

1

まだ別の方法について、任意のUnicodeコードポイントを意味する「文字」を使用して、ここを含め、私が思いついたものです

>>> hashes = ['96a77af1cce6dc64ed5d4c381bb7f143', 
... '11b13de4792e0407aae4a40fd6e4e2d4', 
... 'eec7e31c5e2890adaf0d999835c976fc', 
... ] 
>>> int(''.join(hashes), 16) 
23187806638669244987192443940605368881272088351426889142645412473142674081465702767335075936780031545889279263209212L 
>>> n=_ 
>>> (48 * 8)/32 # calculating bits per character 
12 
>>> 1 << 12 
4096 
>>> chars = [] 
>>> for i in range(32): 
... chars.append(unichr(n % 4096)) 
... n /= 4096 
... 
>>> chars 
[u'\u06fc', u'\u0c97', u'\u0835', u'\u0999', u'\u0f0d', u'\u0ada', u'\u0890', u'\u05e2', u'\u031c', u'\u0c7e', u'\u04ee', u'\u0e2d', u'\u06e4', u'\xfd', u'\u04a4', u'\u0aae', u'\u0407', u'\u02e0', u'\u0479', u'\u03de', u'\u01b1', u'\u0431', u'\u07f1', u'\u01bb', u'\u0c38', u'\u05d4', u'\u04ed', u'\u0dc6', u'\u0ce6', u'\u0f1c', u'\u077a', u'\u096a'] 
>>> ''.join(chars) 
u'\u06fc\u0c97\u0835\u0999\u0f0d\u0ada\u0890\u05e2\u031c\u0c7e\u04ee\u0e2d\u06e4\xfd\u04a4\u0aae\u0407\u02e0\u0479\u03de\u01b1\u0431\u07f1\u01bb\u0c38\u05d4\u04ed\u0dc6\u0ce6\u0f1c\u077a\u096a' 
>>> print _ 
ۼಗ࠵ঙ།૚࢐ע̜౾ӮอۤýҤમЇˠѹϞƱб߱ƻసהӭෆ೦༜ݺ४ 

私はおそらく句読点を避けるために、文字ごとに13ビットを使用しなければならなかったでしょうが、私はあなたがとにかく可逆性を気にしませんでしたので、時間を投資したくなかった。私の周りの頼りなさそう。

は、[後で]いや、する必要はありませんでした:

>>> hashes = ['96a77af1cce6dc64ed5d4c381bb7f143', 
... '11b13de4792e0407aae4a40fd6e4e2d4', 
... 'eec7e31c5e2890adaf0d999835c976fc', 
... ] 
>>> charlist = filter(lambda c: c.isalnum(), map(unichr, range(8000))) 
>>> len(charlist) 
5032 
>>> n = int(''.join(hashes), 16) 
>>> n 
23187806638669244987192443940605368881272088351426889142645412473142674081465702767335075936780031545889279263209212L 
>>> chars = [] 
>>> for i in range(32): 
... chars.append(charlist[n % 4096]) 
... n /= 4096 
... 
>>> chars 
[u'\u0b67', u'\u1448', u'\u0dc5', u'\u10f4', u'\u16cf', u'\u124a', u'\u0ea7', u'\u0931', u'\u0442', u'\u142f', u'\u06c7', u'\u15de', u'\u0b26', u'\u0178', u'\u067d', u'\u121d', u'\u0542', u'\u0406', u'\u0638', u'\u050c', u'\u022c', u'\u0575', u'\u0d6b', u'\u0236', u'\u13dd', u'\u0923', u'\u06c6', u'\u1577', u'\u1497', u'\u16de', u'\u0c87', u'\u10bb'] 
>>> print ''.join(chars) 
୧ᑈළჴᛏቊວऱтᐯۇᗞଦŸٽምՂІظԌȬյ൫ȶᏝणۆᕷᒗᛞಇႻ 
関連する問題