2014-04-19 2 views
0

here에 설명 된 uuid 메소드 중 하나를 사용하여 자바 스크립트에서 데이터의 고유 식별자를 생성하려고합니다. 가능하다면 window.crypto를 사용하기 때문에 this one 줄을 따라있을 확률이 높습니다.자바 스크립트로 생성 된 uuids는 얼마나 독특하고 무작위입니까?

이 ID는 전 세계적으로 고유 할 필요는 없으며 사용자별로 고유합니다. 대규모 응용 프로그램에 대해 고유 한 ID를 충분히 생성합니까? 이것이 id 충돌을 초래할 것이라고 생각할만한 이유가 있습니까? 수있는 자바 스크립트가 충분히 임의의 UUID를 생성이 작동합니까? window.crypto는 꽤 널리 사용되는 것처럼 보입니다.이 특별한 프로젝트는 이미 합리적으로 현대적인 브라우저를 필요로합니다.

더 많은 정보

: 코멘트에서 문제에 대한 몇 가지 배경을 찾을 수 here

답변

0

this answer에 :

... (계속) 두 개의 ID의 확률이에 의해 생성 기능을 충돌 , 말 그대로, 천문학 적으로 작습니다. ID의 128 비트 중 6 비트를 무작위로 생성합니다. 즉, 두 ID에 대해 1 2 ^^ 122 (또는 5.3x10 ^^ 36) 개의 가능성이 있습니다. - 충돌의 1 5,316,911,983,139,663,491,615,228,241,121,378,304에서 (5.3 undecillion) 기회 broofa

.

또한 사용자가이 uuid로 새 레코드를 만들려고 할 때 uuid가 아직 사용 중이 아닌지 확인하십시오. 이것은 사용자 입력을 신뢰하지 않는 더 큰 전략에 해당합니다. 내가 지금 Node.js를 (V8)에서 실행하고있어

function getUUID() { 
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { 
    var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8); 
    return v.toString(16); 
    }); 
} 

var uuids = []; 
var last; 
var numGenerated = 0; 
do { 
    last = getUUID(); 
    if (uuids.indexOf(last) === -1) { 
    uuids.push(last); 
    numGenerated++; 
    console.log(numGenerated); 
    } else { 
    break; 
    } 
} while (true); 

console.log('Got collision after ' + numGenerated + ' generated UUIDS.'); 

및 170,000 IDS 후에도 충돌 무료입니다 :

당신은 당신이 확신하지 않는 경우이 발전기를 테스트 할 수 있습니다. 편집 : 240,000.

+0

나는 그것을 보았지만 나중에 "Math.random이 의사 난수만을 산출하는 한 확률 계산이 잘못된 것 같습니다." – herbrandson

+0

대체 RNG가 있습니다 ... ' –

+0

If 당신은'onmousemove' 이벤트로 마우스 움직임을 감지하는 것과 같은 것을 할 수있는 "더 무작위적인"seed를 원합니다. 그러나 사용자가 콘솔을 가져 와서 변수를 변경하여 자신의 UUID를 제출하면 사용하는 모든 기술은 쓸모가 없습니다. 궁극적으로 서버 측의 유효성을 검사해야합니다. 어쨌든 충돌을 검사하는 것이 필연적이므로 충돌이 거의없는 UUID 솔루션에 만족해야합니다. – Jackson