programing

Ruby에서 GUID 생성

linuxpc 2023. 6. 20. 21:24
반응형

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

반응형