루비에서 길드 생성


142

Guids로 정말 쉽게 해결되는 문제가 있습니다.

특히 비밀번호 재설정 워크 플로의 경우 Guid 토큰을 사용자의 이메일로 보내고 토큰을 사용하여 비밀번호를 재설정하도록하고 싶습니다. guid는 독특하기 때문에 매우 안전하며 사람들에게 암호를 이메일로 보내므로 위험합니다.

Ruby 에는 Guid gem 이 하나 있습니다 . 그러나 그것은 꽤 오래된 것처럼 보이고 파일 시스템에 물건을 씁니다.

누구나 글로벌 고유 식별자를 생성 할 수있는 다른 보석을 알고 있습니까?

나는 단지 다음으로 넘어갈 수 있다는 것을 안다.

(0..16).to_a.map{|a| rand(16).to_s(16)}.join 

그러나 실제로 적절한 GUID처럼 보이지는 않습니다 ...


1
이와 같은 임의의 문자열을 사용하는 것은 옳지 않습니다. UUID의 특정 비트는 변형 및 버전을 지정합니다. 임의의 UUID의 경우 변형 2 (RFC 4122) 및 버전 4가 필요할 수 있습니다.이 경우 6 특정 비트를 올바른 값으로 설정해야합니다.
jtpereyda

1
예 @ dafrazzman이 맞습니다. "UUID를 닮은"것을 무작위로 함께 연결한다고해서 고유성이 보장되는 것은 아닙니다. UUID가 실제로 보장 되지는 않지만 난수를 사용하여 생성하는 것은 충돌에 더 취약하며 "UUID"라는 레이블에 맞지 않습니다. SecureRandom.uuid와 함께하십시오!
dooleyo

답변:


312

Ruby 1.9부터 uuid 생성 기능이 내장되어 있습니다. SecureRandom.uuid기능을 사용하십시오 .

예를 들면 다음과 같습니다.

require 'securerandom'
SecureRandom.uuid # => "96b0a57c-d9ae-453f-b56f-3b154eb10cda"

5
SecureRandom.uuid는 임의의 UUID를 생성하므로 고유 한 것으로 보장되지는 않습니다. 아마도 고유 한 임의의 문자열을 원한다면 이것을 사용하는 것이 좋습니다. 그러나 고유 한 것으로 보장되는 것을 원하면 MAC 주소, 타임 스탬프 및 기타를 포함하는 것을 사용해야합니다.
Mike Dotterer

23
약간의 조회를 저장하려면 '보안 성'이 필요합니다.
Jesse Shieh

8
독창적이라고 보장되는 것은 아니지만 대부분의 실제 목적을 위해 독창적이라고 가정하는 것이 안전합니다. 참조 : stackoverflow.com/questions/2977593/…
Jesse Shieh

문서에 따라 SecureRandom.uuid가 RFC 4122를 따르는 경우 타임 스탬프 필드가있는 것은 아닙니까? 동시성을 차단하는 것이 독특하지 않습니까?
Michael K Madison

@MichaelKMadison AFAIK Ruby는 타임 스탬프를 사용하지 않는 RFC 4122의 "v4"변형을 사용하므로 실제로 충돌 가능성은 크지 않지만 실제로는 그렇지 않을 수도 있습니다.
Edd Morgan


35

우리는 UUIDTools를 사용 하며 아무런 문제가 없습니다.


2
'uuidtools'는 시스템에 MAC 주소가없는 경우에도 작동합니다. 이 경우 'uuid'가 실패합니다.
grefab

3
uuid gem과 달리 uuidtools는 상태 파일을 유지하지 않습니다. 상태 파일의 권한 문제로 인해 uuid gem이 여러 사용자와 함께 사용하기에 다소 어색합니다.
Wayne Conrad

1
UUID 도구가 더 이상 유지되지 않는 것 같습니다. 어떤이 2 년에 github의의의 repo에 커밋이되지 않았습니다
Sudhanshu 슈라에게

22

UUIDTools보셨습니까 ?

UUIDTools는 다양한 유형의 UUID (또는 GUID를 호출하려는 경우 GUID)를 생성하기위한 간단한 라이브러리로 설계되었습니다. 가능할 때마다 RFC 4122를 준수합니다.


16

Google은 다음 Ruby 라이브러리를 생성합니다.

http://raa.ruby-lang.org/project/ruby-guid/

또한 http://www.ruby-forum.com/topic/99262 에서 gem을 설치하고 ( gem uuid명령 행에서 실행 하여 설치) 할 수 있다고 말합니다.

gem 'uuid'
puts UUID.new

새로운 UUID를 보려면 코드에서

(힌트 : guid rubyGoogle에 표시했습니다 )


thx 나는 그것을 보았지만 그것은 아주 오래된 것입니다. 최근 보석처럼 활성화 된 것을 찾고 있습니까?
랜스 폴라드

답변에 추가 한 UUID 보석은 어떻습니까? 아니면 당신이 말한 것입니까?
Marc W

5
그게 이상한 ... 나는 아니라 "GUID 루비"인터넷 검색, 모든 나는이 SO 포스트 - P이었다있어
제이슨 와이트 혼에게


3

Simone Carletti의 작은 업데이트 답변 :

SecureRandom.base64 (8) .gsub ( "/", "_"). gsub (/ = + $ /, "")

=> "AEWQyovNFo0"

다음으로 대체 할 수 있습니다.

SecureRandom.urlsafe_base64 (8)


1

늦은 밤에 프로그래밍하는 동안 Rails에서 고유 한 GUID를 생성하기 위해 다음과 같은 솔루션 (Simone 기반)을 생각해 냈습니다. 나는 그것을 자랑스럽게 생각하지 않지만 꽤 잘 작동합니다.

while Order.find_by_guid(guid = rand(36**8).to_s(36).upcase).present?; end

2
그날 밤 당신의 guid 컬럼을 인덱스하는 것을 기억하시기 바랍니다
nurettin

0

이 질문에서 권장하는 UUID 보석을 사용하면 아무도 고유하고 임의의 UUID를 생성 할 수 없습니다. 내 대답은 해결 방법입니다. 나중에 요청을 충족시킬 보석이 있다면 Ruby에서 gem을 사용하는 것이 좋습니다.

나는이 질문에서 가장 권장되는 uuid 보석을 시도하지만 아무도 나를 만족시키지 않습니다. 우리는 독특하고 무작위적인 uuid가 필요합니다. uuidgen루비로 직접 시스템 명령 을 실행 하고 결과를 좋아하고 여기에서 공유합니다.

puts `uuidgen`
8adea17d-b918-43e0-b82f-f81b3029f688
puts `uuidgen`
6a4adcce-8f64-41eb-bd7e-e65ee6d11231
puts `uuidgen`
51d5348b-8fc3-4c44-a6f7-9a8588d7f08a
puts `uuidgen`
332a0fa3-7b07-41e1-9fc8-ef804a377e4e

uuid보석 과 비교 하면 차이점을 알 수 있습니다.

irb(main):003:0> uuid.generate
=> "40cdf890-ebf5-0132-2250-20c9d088be77"
irb(main):004:0> uuid.generate
=> "4161ac40-ebf5-0132-2250-20c9d088be77"

테스트 환경은 Linux 및 Mac OS 환경입니다.


2
a puts `...`는 기본적으로 uuidgen(3)Linux 이외의 다른 플랫폼에서 실패 하는 시스템 호출을 수행하고 있으며 , 실행 시간이 극적으로 증가하며 일반적으로 직관적 인 코딩 연습에 반대합니다. 왜 그런 방법을 선택 하시겠습니까?
드와이트 스펜서

1
@DwightSpencer 나는 우리가 다른 목적을 가진 다른 지역에 있다고 생각합니다. 실행 시간, 광범위한 운영 체제, 코드 마이그레이션과 같은 관심사는 전혀 없습니다. 코드가 Mac OS 또는 기본 스트림 Linux에서 작동하고 필요한 결과를 얻을 수 있다고 생각합니다. Couse의 경우, Ruby에서 방법을 찾고 uuidgen 명령과 동일한 결과를 얻을 수 있다면 기꺼이 사용하십시오. 그러나 지금까지 나는 아무것도 찾지 못했습니다.
BMW

1
@J_와 @ simone-carletti는 이미이 게시물에서 더 나은 방법을 지적했습니다. 나는 하나의 제안SecureRandom 같은 방법으로 동일한 기능을 수행하는 것으로uuidgen 하지만 uuidgen차단 / dev / random의 사용 과는 달리 SecureRandom먼저 openssl의 라이브러리 만 사용하고 나서 dev / urandom으로 드롭 한 다음 마지막으로 / dev / random을 시도합니다. 비 차단 무작위 화 생성.
드와이트 스펜서

0

이것은 JavaScript에서 배운 깔끔한 기술입니다.

def uuid
    "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx".gsub("x") do
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"[rand(36)]
    end
end

좀 더 '루비 방식'으로 할 수도 있지만

def uuid
    "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx".gsub("x") do
        rand(16).to_s(16)
    end
end
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.