문제

나는 데이터베이스에 대한 SQL Server2000 에서 사용하는 GUID 를 각 사용자는 응용 프로그램을 사용하는것이 있음.게,두 개의 사용 종료와 동일입니다.I know microsoft 에서 사용하는 알고리즘을 생성하는 임의의 GUID 는 매우 낮은 기회를 일으키는 collisons 지만,충돌이 아직도 가능한가요?

도움이 되었습니까?

해결책

기본적으로, 아니요. 누군가가 당신의 데이터베이스에 푹 빠진 것 같아요. 버전 GUID에 따라 값을 사용하는 것은 고유 (버전 1 GUID와 같은 것들) 또는 독특하고 예측할 수없는 (버전 4 GIUDS와 같은 경우)입니다. NewID () 함수에 대한 SQL Server의 구현은 128 비트 임의의 숫자를 사용하는 것으로 보이므로 충돌하지 않을 것입니다.

충돌 확률 1%의 경우 생성해야합니다. 2,600,000,000,000,000,000 안내.

다른 팁

기본적으로 불가능합니다!, 기회는입니다 천문학적으로 낮습니다.

하지만 ... 나는 내가 아는 세상의 유일한 사람입니다. 한 번 안내서를 가졌습니다 (네!).

그리고 나는 그것을 확신하고 실수가 아니라고 확신합니다.

포켓 PC에서 실행중인 작은 응용 프로그램에서 작업이 끝나면 생성 된 안내서가있는 명령이 발행되어야합니다. 서버에서 실행 된 후 명령은 실행 날짜와 함께 서버의 명령 테이블에 저장되었습니다. 디버깅 할 때 어느 날 모듈 명령 (새로 생성 된 안내서가 첨부 된 상태)을 발행했지만 아무 일도 일어나지 않았습니다. 나는 다시 한 번 (동일한 안내서로, 조작 시작시 Guid가 한 번만 생성 되었기 때문에), 그리고 다시는 아무것도, 그리고 마침내 명령이 실행되지 않는 이유를 알아 내려고 노력했다. 나는 명령 테이블을 확인했다. 그리고 현재와 같은지도는 3 주 전에 삽입되었습니다. 이것을 믿지 않고, 나는 2 주 동안 백업에서 데이터베이스를 복원했고, 안내서가있었습니다. 코드를 확인했습니다. 새로운 안내서는 의심의 여지없이 신선하게 생성되었습니다. Pow Guid Collision, 한 번만 일어 났지만, 대신 Lotto에서 이겼을 때, 기회는 더 크다 :).

편집 : 이런 일이 발생할 가능성이 크게 높아질 수있는 몇 가지 요인이 있으며, 응용 프로그램은 PocketPC 에뮬레이터에서 실행 중이며 에뮬레이터는 스테이트 스테이트 기능을 갖추고있어 상태가 복원 될 때마다 현지 시간이 복원됩니다. 그리고 안내는 내부 타이머를 기반으로합니다 .... 또한 컴팩트 프레임 워크에 대한 안내 알고리즘은 예를 들어 COM보다 완전하지 않을 수 있습니다 ...

이론적으로 가능하지만, 3.4E38 가능한 숫자를 사용하면 1 년 안에 수십 억 개의 안내서를 만들면 하나의 복제본을 가질 가능성은 0.00000000006입니다 (원천).

두 사용자가 동일한 안내서로 끝나면 프로그램에 데이터를 복사하거나 공유하는 버그가 있음을 베팅합니다.

처음에서 찾을 수 있습니다 기회의 충돌의 Guid.그렇지 않으로 다른 답변 주장했,1 에서 2^128(10^38)기 생일을 역설, 즉,50%의 기회를 두 Guid 를 충돌할 확률은 실제로는 1 2^64(10^19)이 많이 작습니다.그러나,이것은 여전히 매우 큰 숫자,그리고 이와 같이 확률의 충돌을 사용할 경우 적절한 수의 Guid 이 낮습니다.

참고 또한 Guid 를 포함되지 않은 타임 스탬프 또는 MAC 주소로 많은 사람들이 또한 것을 믿는 것입니다.이 사실에 대한 v1Guid 지 지금 v4Guid 를 사용되는 단순히 의사 난수 을 의미하는 가능성의 충돌이 틀림없이 높기 때문에 그들은 더 이상에 고유한 시간과 기계입니다.

그래서 본질적으로 대답은 예,충돌이 가능합니다.하지만 그들은 매우 어렵다.

편집:정을 말한 2^64

두 개의 무작위 안내가 충돌 할 가능성 (10^38에서 ~ 1)은 손상된 TCP/IP 패킷을 감지하지 못할 가능성보다 낮습니다 (~ 1 in 10^10). http://wwwse.inf.tu-dresden.de/data/courses/se1/se1-2004-lec12.pdf, 11 페이지. 이것은 또한 디스크 드라이브, CD 드라이브 등에 해당됩니다 ...

안내는 통계적으로 고유하며 DB에서 읽은 데이터는 통계적으로 만 정확합니다.

나는 고려할 것이다 Occam의 면도기 이 경우 좋은 가이드로. 안내 충돌이있을 가능성은 거의 없습니다. 버그가 있거나 누군가가 데이터를 엉망으로 만들 가능성이 훨씬 높습니다.

Wikipedia 's를 참조하십시오 전 세계적으로 고유 한 식별자 기사. 안내를 생성하는 방법에는 여러 가지가 있습니다. 명백히 구식 (?) 방식으로 Mac 주소, 매우 짧은 장치로 다운 타임 스탬프와 고유 한 카운터 (동일한 컴퓨터에서 빠른 세대를 관리하기 위해)를 사용하므로 복제를 거의 불가능하게 만드는 것은 거의 불가능합니다. 그러나이 안내서는 사용자를 추적하는 데 사용될 수 있기 때문에 삭제되었습니다 ...

Microsoft가 사용하는 새로운 알고리즘을 확신하지 못한다 (이 기사는 일련의 안내서를 예측할 수 있고 더 이상 타임 스탬프를 사용하지 않는 것처럼 보일 수 있습니까? 위에 연결된 Microsoft 기사는 다른 것을 말합니다.

이제 안내는 이름으로 전 세계적으로 독특하도록 신중하게 설계되었으므로 불가능하거나 매우 낮은 확률이 매우 높습니다. 나는 다른 곳을 볼 것이다.

중복 MAC 주소가있는 이더넷 카드가있는 2 개의 Win95 시스템은 엄격하게 제어 된 조건에서 중복 안내서를 발행합니다. 특히 건물에서 전원이 꺼지고 정확히 동시에 부팅됩니다.

나는 안내가 마술적이고 독특하다는 느낌이 좋다는 느낌의 대답을 좋아한다는 것을 알고 있지만 실제로는 대부분의 안내서는 121 비트 임의의 숫자입니다 (비트 중 7 개는 서식에 낭비됩니다). 큰 무작위 숫자를 사용하는 것이 편하지 않으면 안내서를 사용하는 것이 편하지 않아야합니다.

안내서를 생성하는 데 사용되는 코드에 버그가있을 수 있습니까? 예, 물론 가능합니다. 그러나 대답은 컴파일러 버그와 동일합니다. 자신의 코드는 버그가 될 가능성이 높으므로 먼저 살펴보십시오.

물론 가능 .... 가능합니까? 가능하지는 않지만 가능합니다.

동일한 기계가 모든 Guid (서버)를 생성하고 있으므로 기계 별 정보를 기반으로하는 많은 "무작위성"이 손실됩니다.

미소를 위해 다음 스크립트를 시도해보십시오 ... (SQL 2005에서 작동합니다.

declare @table table
(
    column1 uniqueidentifier default (newid()),
    column2 int,
    column3 datetime default (getdate())
)

declare @counter int

set @counter = 1

while @counter <= 10000
begin
    insert into @table (column2) values (@counter)
    set @counter = @counter + 1
end

select * from @table

select * from @table t1 join @table t2 on t1.column1 = t2.column1 and t1.column2 != t2.column2

이것을 반복적으로 실행 (1 초 미만)은 매우 짧은 시간 간격으로도 첫 번째 선택에서 상당히 넓은 범위를 생성합니다. 지금까지 두 번째 선택은 아무것도 생산하지 않았습니다.

사용자가 네트워크 카드를 갖는 다른 기계를 가지고 있다면 불가능하고, 그렇지 않더라도 여전히 거의 이론적 인 위험이 거의 없습니다.

개인적으로 나는 안내 충돌보다는 버그 일 가능성이 높기 때문에 다른 곳을 본다.

물론 더 짧게 만들기 위해 가이드에서 조금 자르지 않도록 제공합니다.

물론 가능하고 아마도 가능성이 높습니다. 각 안내서가 가능한 숫자 공간의 임의의 부분에있는 것과는 다릅니다. 두 개의 스레드가 하나를 동시에 생성하려고 시도한 경우, 주위의 세마포어로 일종의 중앙 집중식 안내 기능을 제외하고는 같은 값으로 끝날 수 있습니다.

나는 이것을 네트워킹 사람이 아니기 때문에 다음과 같은 문장을 할 수 있습니다. "

일리노이 주립 대학에서 일할 때, 우리는 다른 시간에 주문한 두 개의 Dell 데스크톱을 가지고있었습니다. 우리는 네트워크에 첫 번째를 넣었지만 네트워크에 두 번째를 넣으려고 할 때 우리는 미친 오류를 받기 시작했습니다. 많은 문제 해결 후, 두 기계가 동일한 Guid를 생성하는 것으로 판단되었습니다 (정확히 무엇을위한 것이 확실하지 않지만 네트워크에서는 사용할 수 없었습니다). Dell은 실제로 두 기계를 결함이있는 것으로 교체했습니다.

당신이 당신이 NEWID() SQL Server의 기능 (물론 다른 답변이 강조된 것처럼 가능하지만 가능). 그들이 지적하지 않은 한 가지는 야생의 브라우저에서 JavaScript에서 GUID를 생성하면 충돌이 발생할 가능성이 높다는 것입니다. 다른 브라우저에 RNG에 문제가있을뿐만 아니라 Google Spiders가 그런 기능의 결과를 캐시하는 것처럼 보이는 문제가 발생하여 동일한 안내서를 시스템에 반복적으로 전달했습니다.

자세한 내용은 여기에서 다양한 답변을 참조하십시오.

JavaScript에서 UUID를 생성 할 때 충돌?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top