3

Just for debugging purposes I would like to map a big string (a session_id, which is difficult to visualize) to a, let's say, 6 character "hash". This hash does not need to be secure in any way, just cheap to compute, and of fixed and reduced length (md5 is too long). The input string can have any length.

How would you implement this "cheap_hash" in python so that it is not expensive to compute? It should generate something like this:

def compute_cheap_hash(txt, length=6):
    # do some computation
    return cheap_hash

print compute_cheap_hash("SDFSGSADSADFSasdfgsadfSDASAFSAGAsaDSFSA2345435adfdasgsaed")
aBxr5u
4

3 に答える 3

8

MD5 が均一に分散されているかどうかは思い出せませんが、わずかな入力の違いでも大きく変化するように設計されています。

私の計算は信用できませんが、MD5 hexdigest の最初の 6 桁の衝突確率は 2^64 だと思います。

だからあなたはただすることができますcheap_hash = lambda input: hashlib.md5(input).hexdigest()[:6]

その後、hash = cheap_hash(any_input)どこでも使用できます。

PS: 任意のアルゴリズムを使用できます。MD5 は計算コストがわずかに安くなりますがhashlib.sha256、一般的な選択肢でもあります。

于 2012-12-24T16:05:47.120 に答える
7
def cheaphash(string,length=6):
    if length<len(hashlib.sha256(string).hexdigest()):
        return hashlib.sha256(string).hexdigest()[:length]
    else:
        raise Exception("Length too long. Length of {y} when hash length is {x}.".format(x=str(len(hashlib.sha256(string).hexdigest())),y=length))

This should do what you need it to do, it simply uses the hashlib module, so make sure to import it before using this function.

于 2012-12-24T16:02:54.127 に答える
1

この同様の質問を見つけました: https://stackoverflow.com/a/6048639/647991

だからここに関数があります:

import hashlib

def compute_cheap_hash(txt, length=6):
    # This is just a hash for debugging purposes.
    #    It does not need to be unique, just fast and short.
    hash = hashlib.sha1()
    hash.update(txt)
    return hash.hexdigest()[:length]
于 2012-12-24T16:05:39.113 に答える