2011-02-17 2 views
6

저는 루비에서 긴 문자열로 짧은 비 충돌 문자열을 만들려고합니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까? Base64는 MD5 해시를 인코딩합니까?긴 문자열에서 짧은 해시 문자열을 생성하는 가장 좋은 방법은 무엇입니까

loop do 
    key = short_hash("#{user_id}-#{timestamp}") 
    break if $redis.setnx(key, "0") 
end 

나는 키가 너무 오래되고 싶지 않아 :

은 사용 사례입니다.

+0

비슷한 주제에 대해이 사이트에 많은 질문이 있습니다. 해싱 주제를 검색해보십시오. 하나 있습니다 : http://stackoverflow.com/questions/4066601/developing-a-url-shortener/4066615#4066615 –

+1

@Sugerman : 그 질문은 파이썬에 있습니다. –

+2

당신이 그 (그리고 다른) 쓰레드의 응답으로부터 무엇을 모으는지를 읽는다면, 이것을 행하는 "최선의 방법"은 언어에 구애받지 않는다는 것입니다. 먼저 해싱 알고리즘을 선택한 다음 언어 별 구현에 대해 걱정하십시오. –

답변

4

나는 종종 SHA를 사용하여 당신이 가지고있는 예와 비슷하다. 고유합니다, 그러나 대부분의 목적을 위해 충분히 일반적으로 좋은 아니에요 :

ruby UUID gem
require 'digest/sha1' 
Digest::SHA1.hexdigest("#{user_id}-#{Time.now.to_i}-#{rand}") 

다른 옵션입니다.

하지만 redis를 사용하고 있으므로 구체적인 경우에는 redis INCR 명령을 사용하는 것이 가장 좋은 이유는 무엇입니까? 그런 다음 적어도 데이터베이스 내에서 유일성을 보장 할 수 있습니다. 예 :

unique_key = $redis.incr('users:next') 
+0

흠 "incr"을 사용하려고 생각했지만 unique_key 값을 저장해야합니다 ... 'uid = $ r.incr ('uids '); $ r.set (uid, value)' –

+0

그래서 나는'incr'을 가지고 끝났지 만 원래의 질문에 대해서는'Digest :: SHA1.hexdigest'보다 더 짧은 해쉬를 가지기를 희망했습니다. 나는 base64 인코딩을 사용할 수 있다고 생각합니다 ... –

4

해시 함수를 사용하여 이 아닌 짧은 문자열을 만들 수 있습니다. 그러나 Pigeonhole principle을 보장하므로 동일한 값으로 해시되는 두 개의 긴 문자열을 찾을 수 있습니다.

고유 한 값을 생성하려면 순차적 식별 번호를 지정해야 할 수 있습니다. 그러나 이것은 또한 당신이 당신이 어느 입력 문자열과 관련 지을 수있는 식별 번호를 추적 할 것을 요구할 것입니다.

+0

죄송합니다. 충돌을 확인하고 다시 시도 할 것임을 언급하는 것을 잊어 버렸습니다. 나는 단지 "재 시도"를 가능한 한 피하고 싶다. –

관련 문제