데이터베이스의 ID에 해당하는 고유 한 해시를 만들어야합니다. 데이터베이스의 해당 행에 임의의 영숫자 해시를 생성해야합니까?고유 한 해시 만들기
지금 당장이 작업을 수행하고 있지만 사람들이이 해시를 만드는 알고리즘을 이해할 수 없도록해야합니다.
params[:slug].to_i(36)
id.to_s(36)
데이터베이스의 ID에 해당하는 고유 한 해시를 만들어야합니다. 데이터베이스의 해당 행에 임의의 영숫자 해시를 생성해야합니까?고유 한 해시 만들기
지금 당장이 작업을 수행하고 있지만 사람들이이 해시를 만드는 알고리즘을 이해할 수 없도록해야합니다.
params[:slug].to_i(36)
id.to_s(36)
매우 간단합니다 :
는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
는 다음 문자를 사용하려면 간단히 경우
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
이 귀하의 질문에 대답합니까? 실제로
.
('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"]
당신이 하나를 체크 아웃 할 수 있습니다
: http://stackoverflow.com/questions/6338870/how-to-implement-a-short-url-like-urls-in-twitter – Casper
데이터베이스는 탁월 UID 값을 생성하므로 DBM의 설명서를 참조하여 지원되는 항목을 확인하십시오. DBM이 Rails보다 더 빨리 처리 할 수 있습니다. –