2011-04-05 5 views
0

가상 조립 라인에서 제품의 일련 번호를 생성하는 난수 생성기를 만들려고합니다. 우리는 생성 할 난수를 얻었지만 일련 번호이기 때문에 중복을 만들지 않기를 원합니다. 다시 돌아가서 생성 된 번호가 이미 생성되었는지 확인한 다음 새 번호를 생성하기 위해 복제본인지 여부를 확인하고 " 고유 한 "번호.jscript에서 임의 번호 생성기 생성 및 중복 방지

+0

각 제품의 이름/ID/무언가를 해시하는 것이 쉬울까요? – JCOC611

+0

@ JCOC611 - 해시가 충돌하므로 여기에서 사용하려는 것이 아닙니다. 고유성을 보장하는 결정적 알고리즘이 원하는 것입니다. – tvanfosson

답변

3

가장 쉬운 방법은이 문제를 해결하는 것입니다. 일련 번호의 일부를 구성하기 위해 시간과 같이 단조롭게 증가하는 것을 사용하십시오. 이를 위해 라인을 식별하는 고정 값을 미리 추가 할 수 있습니다.

그래서 일련 번호 형식이 NNNN은 4 자리의 줄 번호입니다 NNNNYYYYMMDDHHMMSS 될 수 있고 YYYY는 4 자리 연도, MM은

여러 가지를 만들 수 있다면 ..., 2 자리수의 달 단위 시간당 하나만 가능할 때까지 날짜 구성 요소를 추가하거나 오늘 생성 된 항목 수를 YYYYMMDD 구성 요소 (예 : NNNNYYYMMDDCCCCCC)에 추가하십시오.

+2

일부 숫자에 대해 더 높은 기준을 사용하여 더 짧게 만들 수 있습니다. 예를 들어 base-32는 0-9A-Z (ILOQ 빼기)를 사용합니다. 이렇게하면 3 자리 "1"자로 된 월과 일 3 자리로 연도를 인코딩 할 수 있습니다. – tvanfosson

5

일련 번호의 핵심은 임의가 아니라는 것입니다. 일련 번호 definition에 의해 일련 번호가 지정됩니다. 왜 단순히 증가하는 숫자를 사용하지 않는가?

+0

에 동의합니다. – Linmic

0

정말 임의의 숫자를 사용하면 전체 컬렉션을 저장하고 각 숫자에 대해 검토해야합니다. 분명히 이것은 세대가 느리고 느려질 것입니다. 생성하는 키의 수가 많을수록 (재 시도가 많아지고 더 큰 데이터 세트와 비교해야하기 때문에).

이 이유는 진정으로 난수가이 목적으로 사용되지 않는 이유입니다. 일련 번호의 경우 표준은 항상 순차적 번호 만 수행합니다 - 임의적 인 실제 값이 있습니까?

고유 ID는 거의 무작위가 아닙니다. GUID 등은 시스템 시간과 (대개의 경우) MAC 주소를 기반으로합니다. 값의 크기 나 임의성 수준 때문에가 아니라 사용 된 알고리즘과 기계 특성으로 인해 전 세계적으로 고유합니다.

개인적으로 나는 순차 값 (여러 개의 채널이있는 경우 고유 한 접두어로)을 사용하거나 더 나은 용도로 실제 GUID를 사용할 수있는 모든 작업을 수행합니다.

0

여기를 클릭하십시오.

var rArray; 

function fillArray (range) 
{ 
    rArray = new Array(); 

    for(var x = 0; x < range; x++) 
    rArray [x] = x; 
} 

function randomND (range) 
{ 
    if (rArray == null || rArray.length < 1) 
    fillArray (range); 

    var pos = Math.floor(Math.random()*rArray.length); 
    var ran = rArray [pos]; 

    for(var x = pos; x < rArray.length; x++) 
    rArray [x] = rArray [x+1]; 

    var tempArray = new Array (rArray.length-1) 
    for(var x = 0; x < tempArray.length; x++) 
    tempArray [x] = rArray [x]; 

    rArray = tempArray; 

    return ran; 
} 
+0

이미 수용된 답변에서 어떻게 개선 될까요? –