Ruby에서 GUID 생성
GUID로 정말 쉽게 해결할 수 있는 문제가 있습니다.
특히 비밀번호 재설정 워크플로우의 경우, 사용자의 이메일로 GUID 토큰을 전송하여 해당 토큰을 사용하여 비밀번호를 재설정하도록 하고 싶습니다.GUID는 고유하기 때문에 매우 안전하고 사람들에게 이메일 암호를 보내는 것을 절약할 수 있습니다. 이는 위험합니다.
@ 루비포지에 하나의 UUID 보석이 있다는 것을 알았지만 꽤 오래된 것처럼 보이고 파일 시스템에 내용을 씁니다.
세계적으로 유일한 식별자를 만들 수 있는 다른 보석을 아는 사람이 있습니까?
저는 그냥 다음과 같이 돌아갈 수 있다는 것을 참조하십시오.
(0..16).to_a.map{ |a| rand(16).to_s(16) }.join
하지만 제대로 된 GUID는 아닌 것 같습니다...
Ruby 1.9 기준으로 UUID 생성이 내장되어 있습니다.함수를 사용합니다.
예:
require 'securerandom'
SecureRandom.uuid # => "96b0a57c-d9ae-453f-b56f-3b154eb10cda"
>> require 'digest'
=> []
>> Digest::SHA1.hexdigest("some-random-string")[8..16]
=> "2ebe5597f"
>> SecureRandom.base64(8).gsub("/","_").gsub(/=+$/,"")
=> "AEWQyovNFo0"
>> rand(36**8).to_s(36)
=> "uur0cj2h"
UUID Tools를 살펴보셨습니까?
UUIDTools는 다양한 유형의 UUID(또는 이를 GUID라고 부르고자 하는 경우 GUID)를 생성하기 위한 단순한 라이브러리로 설계되었습니다.가능할 때마다 RFC 4122를 준수합니다.
또한 루비 포럼에서는 보석을 설치할 수 있다고 합니다(실행).gem uuid
명령행에서 설치)한 다음 작업을 수행합니다.
gem 'uuid'
puts UUID.new
코드에서 새 UUID를 확인할 수 있습니다.
(힌트: 나는 guid ruby를 검색했습니다)
Simone Carletti 답변에 대한 작은 업데이트:
SecureRandom.base64(8).gsub("/","_").gsub(/=+$/,"")
=> "AEWQyovNFo0"
다음으로 대체할 수 있습니다.
SecureRandom.urlsafe_base64(8)
적절한 mysql, varchar 32 GUID를 생성하려면 다음과 같이 하십시오.
SecureRandom.uuid.gsub('-','').upcase
이것은 자바스크립트에서 배운 넷 기술입니다.
def uuid
"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx".gsub("x") do
"0123456789ABCDEF"[rand(16)]
end
end
좀 더 '루비적인 방식'으로 하면 다음과 같은 일도 할 수 있습니다.
def uuid
"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx".gsub("x") do
rand(16).to_s(16)
end
end
포스트그레를 실행하는 레일의 경우SQL 데이터베이스는 두 가지 작업을 수행합니다.
1단계: 발판/모델 생성
rails g scaffold manager name:string --primary-key-type=uuid
2단계: 마이그레이션 파일에 줄 추가
네가 만약rails db:migrate
이제, 당신은 받을 것입니다.PG::UndefinedFunction: ERROR: function gen_random_uuid() does not exist
오류
마이그레이션 파일에 추가합니다.
enable_extension 'pgcrypto' unless extension_enabled?('pgcrypto')
예:
class CreateManagers < ActiveRecord::Migration[7.0]
enable_extension 'pgcrypto' unless extension_enabled?('pgcrypto')
def change
create_table :managers, id: :uuid do |t|
t.string :name
t.timestamps
end
end
end
끝났습니다!
아, 마지막으로, 당신은 추가만 하면 됩니다.enable_extension 'pgcrypto' unless extension_enabled?('pgcrypto')
하나의 마이그레이션 파일(예: UUID 유형을 처음 사용하는 경우)로 이동합니다.
새 레일 버전 >= 5.1
새 레일 버전의 경우 이제 다음 방법을 사용할 수 있습니다.Digest::UUID
예를 들면
API 문서 참조:
늦은 밤 프로그래밍을 하는 동안 저는 레일즈에서 고유한 GUID를 생성하기 위한 다음과 같은 솔루션(Simone의 답변을 기반으로 함)을 생각해냈습니다.나는 그것이 자랑스럽지 않지만 꽤 잘 작동합니다.
while Order.find_by_guid(guid = rand(36**8).to_s(36).upcase).present?; end
이 질문에서 권장하는 UUID 보석을 사용했을 때, 아무도 고유하고 임의의 UUID를 생성할 수 없습니다.제 대답은 해결책입니다. 나중에 우리가 요청을 만족시키기 위해 보석이 있다면 루비에 보석을 사용하는 것이 좋을 것입니다.
저는 이 질문에서 가장 추천되는 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 환경입니다.
언급URL : https://stackoverflow.com/questions/1117584/generating-guids-in-ruby
'programing' 카테고리의 다른 글
i == (i = 2)의 결과는 무엇입니까? (0) | 2023.06.20 |
---|---|
형식 암시의 하위 클래스 (0) | 2023.06.20 |
Oracle PL/SQL에서 <, > 및 & 문자를 html 엔티티로 이스케이프하는 방법 (0) | 2023.06.20 |
Excel은 탭으로 구분된 파일을 줄 바꿈 없이 저장합니다(UNIX/Macos X). (0) | 2023.06.15 |
소방서:다중 조건부 where 절 (0) | 2023.06.15 |