2011-07-26 2 views
0

개별 주문에 대해 4 자리 확인 코드를 생성해야하는 시나리오가 있습니다. 나는 두 개의 정확한 코드가 같은 시간에 거의 생성되지 않을 가능성으로 인해 무작위 코드를하고 싶지 않다. 각 주문의 ID를 사용하고 4 자리 코드를 생성하는 방법이 있습니까? 나는 이것이 결국 반복적 인 코드를 갖게 될 것이라는 것을 안다.하지만 같은 시간에 생성되지 않기 때문에 괜찮을 것이다. 주문 ID가 4 개 이상의 숫자가있는 경우루비의 ID를 기반으로 임의의 정수 생성

+0

ID에 대해 알려주시겠습니까? (예 : 0 <= id <= 9999 또는 0 <= id <= 999999999999999999999999999999999999) – compman

답변

2

정말 코드를 ID에 기반해야합니까? 네 자리 숫자는 가능한 한만 가지 값만 제공하므로 스크립트로 모든 값을 생성하고 데이터베이스 테이블에 던져 넣을 수 있습니다. 그런 다음 필요에 따라 데이터베이스에서 무작위로 하나를 꺼내서 끝내면 다시 넣을 수 있습니다.

귀하의 코드 표는 다음과 같이 보일 것이다 :

  • code을 : 코드
  • uuid, • UUID, NULL 값이 여기에이 코드가없는 것을 나타냅니다.

그런 다음, 코드를 잡아 먼저 UUID, uuid을 생성하고,이 작업을 수행 :

update code_table 
set uuid = ? 
where code = (
    select code 
    from code_table 
    where uuid is null 
    order by random() 
    limit 1 
) 
-- Depending on how your database handles transactions 
-- you might want to add "and uuid is null" to the outer 
-- WHERE clause and loop until it works 

(?이 될 것이다 어디 uuid) 안전한 방식으로 코드를 보유하고 다음이 : (?가 다시 uuid 임)

select code 
from code_table 
where uuid = ? 

를 당겨 데이터베이스에서 코드를 제거하십시오.

은 나중에, 누군가가 뭔가 코드를 사용합니다 다음 단지 :

update code_table 
set uuid = null 
where code = ? 

다시 풀에 코드를 공개하기 (code 코드 임). 당신이 order by random()을 사용하는 경우에도에만 만 개 가능 코드가

, 즉 데이터베이스에 대한 아주 작은입니다.

이 방법의 좋은 장점은 쉽게 무료로 얼마나 많은 코드를 볼 수 있다는 것입니다; 이렇게하면 자동으로 코드 풀을 매일/주/월/...로 확인할 수 있으며 무료 코드 수가 전체 코드 공간의 20 % 이하로 떨어지면 불만을 토로합니다. 당신이 그렇게 중복을 피하기 이유를 한 곳에서 모든 것을 관리 할 것인지

당신은 어쨌든 사용중인 코드를 추적 할 수 있나요?

0

는, 이미 생성 된 값의 배열에 생성 된 값을 확인하지 않고 theoreticly 불가능합니다, 당신은 같은 것을 할 수 있습니다

require 'mutex' 
$confirmation_code_mutex = Mutex.new 
$confirmation_codes_in_use = [] 

def generate_confirmation_code 
    $confirmation_code_mutex.synchronize do 
    nil while $confirmation_codes_in_use.include?(code = rand(8999) + 1000) 
    $confirmation_codes_in_use << code 
    return code 
    end 
end 

하는 $confirmation_codes_in_use을 정리하는 것을 잊지 마십시오 코드를 사용한 후.