2012-12-24 3 views
1

디버깅 전용 목적 큰 문자열 (시각화하기 어려운 session_id)을 6 문자 "해시"로 매핑하고 싶습니다. 이 해시는 어떤 방식 으로든 보안이 필요하지 않으며 계산하기가 저렴하고 길이가 고정되어 줄어 듭니다 (md5가 너무 깁니다). 입력 문자열의 길이는 제한이 없습니다.문자열을 작은 고정 길이 문자열에 매핑하는 것

비싸지 않게 계산할 때 비싸지 않은 "cheap_hash"를 어떻게 구현합니까? 그것은이 같은 생성해야합니다 : 이것은 당신이해야 할 일을해야

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

print compute_cheap_hash("SDFSGSADSADFSasdfgsadfSDASAFSAGAsaDSFSA2345435adfdasgsaed") 
aBxr5u 
+4

충돌로 걱정하지 않으면 MD5에서 처음 6자를 가져옵니다. –

+0

일반적으로 매우 빠르기 때문에 체크섬 알고리즘을 살펴볼 수 있습니다. –

+0

충돌에 대해 전혀 걱정하지 않습니다. 이것은 단일 런타임에서 최대 1000 개의 문자열을위한 것이며, 충돌이 있어도 디버깅 중입니다. 나는 조금 혼란스러워 할 것이다. – dangonfast

답변

3

내가 MD5가 균일하게 분포되어있는 경우 불러올 수는 없지만,이에 대해서도 많은 변화하도록 설계 입력에서 가장 작은 차이.

내 수학을 믿지 마라.하지만 MD5 hexdigest의 처음 6 자리 숫자는 충돌 가능성이 2^64라고 생각한다.

그냥 cheap_hash = lambda input: hashlib.md5(input).hexdigest()[:6] 일 수 있습니다.

그 후 hash = cheap_hash(any_input)을 어디에서나 사용할 수 있습니다.

PS : 모든 알고리즘을 사용할 수 있습니다. MD5는 약간 더 저렴하지만 hashlib.sha256도 인기가 있습니다.

5
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)) 

, 그것은 단순히 hashlib 모듈을 사용을하므로이 기능을 사용하기 전에 가져올 수 있는지 확인하십시오.

내가이 비슷한 질문을 발견
0

: 그래서 여기 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] 
관련 문제