2014-12-20 2 views
2

데이터베이스의 ID에 해당하는 고유 한 해시를 만들어야합니다. 데이터베이스의 해당 행에 임의의 영숫자 해시를 생성해야합니까?고유 한 해시 만들기

지금 당장이 작업을 수행하고 있지만 사람들이이 해시를 만드는 알고리즘을 이해할 수 없도록해야합니다.

params[:slug].to_i(36) 

id.to_s(36) 
+0

: http://stackoverflow.com/questions/6338870/how-to-implement-a-short-url-like-urls-in-twitter – Casper

+0

데이터베이스는 탁월 UID 값을 생성하므로 DBM의 설명서를 참조하여 지원되는 항목을 확인하십시오. DBM이 Rails보다 더 빨리 처리 할 수 ​​있습니다. –

답변

3

매우 간단합니다 :

enum = [*'a'..'z', *'A'..'Z', *0..9].shuffle.permutation 
enum.next.join 
=> "qmrbSTBu6gGpMs4Jh0VZAiI9cW58jxoDz2NwL1eUClaFtdRXfPEOYQnvkKy7H3" 

factorial(62) UNIQ 문자열 /의 UID를 제공합니다. (매우 큰 숫자입니다!)

더 짧은 문자열/uid를 원할 경우 permutation으로 제한을 제공 할 수도 있지만 생성 할 수있는 uniq 문자열/uid의 양은 줄어 듭니다.

enum = [*'a'..'z', *'A'..'Z', *0..9].shuffle.permutation(13) 
enum.next.join 
=> "A1BD3qljTKpOm" 

보안에 대한 우려가 있다면, 다음, 안전한 임의 초기 값으로 배열 셔플 :

ary = [*'a'..'z', *'A'..'Z', *0..9].shuffle(random: SecureRandom.hex(23).to_i(16)) 
enum = ary.permutation(13) 
enum.next.join 
=> "9bNmv82ruBKjq" 

고유성은 데이터베이스 또는 테스트를 호출의 오버 헤드없이 보증 (따라서 제한)이며, 유일성. 당신은 당신이 필요로 길이를 변경할 수 있습니다

('a'..'z').to_a.shuffle[0..7].join 

는 다음 문자를 사용하려면 간단히 경우

+0

도 디코딩 할 수 있습니까? – Tyler

+0

@TylerRice 더 자세히 설명해 주시겠습니까? 정확히 무엇을 디코딩합니까? 아무도 그 다음 시퀀스를 추측 할 수 없을 것입니다. 어떤 시도를하기 전에 임의의'seed'가 먼저 필요하며,'seed'가 동적으로 생성되기 때문에 획득하기가 매우 어려울 것입니다. – yeyo

+0

오, 오케이 ... 지금이게 뭔지 이해합니다 ....정수 ID를 가지고 해시로 바꾼 다음 정수 ID – Tyler

3

SecureRandom 라이브러리를 사용하십시오. 고유 한 값을 보장하지 않으므로 new_id를 지정하기 전에 Model.exists? (field_name : new_id)를 수행해야합니다.

def generate_random_id 
     loop do 
     random_number = SecureRandom.hex(10) 
     break random_number unless User.exists?(random_id: random_number) 
     end 
    end 

http://ruby-doc.org/stdlib-2.1.2/libdoc/securerandom/rdoc/SecureRandom.html

이 귀하의 질문에 대답합니까? 실제로

+0

영숫자 또는 숫자 만 허용합니까? 나는이 URL들로 문자 메시지를 보내므로 – Tyler

+0

을 디코드하기를 원하기 때문에 이것을 가능한 한 짧게 만들 필요가 있습니까? –

+0

예 가능한 경우 – Tyler

0

.

('a'..'z').to_a.shuffle 
=> ["c", "g", "l", "k", "h", "z", "s", "i", "n", "d", "y", "u", "t", "j", "q", 
"b", "r", "o", "f", "e", "w", "v", "m", "a", "x", "p"] 
당신이 하나를 체크 아웃 할 수 있습니다
관련 문제