>

이는 이 질문 과 관련이 있습니다. 이 답변 을 사용하여 UUID를 생성하고 있습니다. 자바 스크립트에서 :

'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);
});

이 솔루션은 제대로 작동하는 것처럼 보이지만 충돌이 발생합니다. 여기 내가 가진 것입니다 :

  • Chrome에서 실행되는 웹앱
  • 16 명의 사용자
  • 이 사용자가 지난 2 개월 동안 약 4000 개의 UUID를 생성했습니다.
  • 저는 약 20 건의 충돌이 발생했습니다 (예 : 오늘 생성 된 새로운 UUID는 약 2 개월 전과 다릅니다 (다른 사용자).

질문은 다음과 같습니다.

<올>
  • 문제의 원인은 무엇입니까?
  • 어떻게 피할 수 있습니까?
    • 답변 # 1

      내 최고의 추측은 Math.random() 입니다  어떤 이유로 시스템에서 손상되었습니다 (사운드가 들리기 때문에). 이것은 내가 충돌을 본 사람 중 첫 번째 보고서입니다.

      node-uuid  해당 코드에서 16 진수의 분포를 테스트하는 데 사용할 수있는 테스트 하네스가 있습니다. 괜찮아 보이면 Math.random() 가 아닙니다. 그런 다음 사용중인 UUID 구현을 uuid() 로 대체하십시오.  방법을 사용하여 여전히 좋은 결과를 얻을 수 있는지 확인하십시오.

      [업데이트 : 방금 Math.random() 의 버그에 대한 Veselin의 보고서를 보았습니다.  시작할 때. 문제는 시작시에만 발생하므로 node-uuid  테스트는 유용하지 않을 것입니다. devoluk.com 링크에 대해 더 자세하게 설명하겠습니다.]

    • 답변 # 2

      실제로 충돌이 있지만 Chrome에서만 가능합니다. 여기 주제에 대한 나의 경험을 확인하십시오

      http://devoluk.com/google-chrome-math-random-issue.html

      Math.random의 처음 몇 번의 호출에서만 충돌이 발생하는 것 같습니다. 위의 createGUID/testGUIDs 메소드를 실행하면 분명히 충돌이 발생하지 않고 작동합니다.

      전체 테스트를하려면 Chrome을 다시 시작하고, 32 바이트를 생성하고, Chrome을 다시 시작하고, 생성하고, 다시 시작하고, 생성해야합니다 ...

    • 답변 # 3

      다른 사람들이이를 알 수 있도록 여기에 언급 된 UUID 생성 기술을 사용하여 놀랍도록 많은 충돌이 발생했습니다. 이 충돌은 난수 생성기를 위해 시드로 전환 한 후에도 계속되었습니다. 상상할 수 있듯이 머리카락이 찢어졌습니다.

      결국 문제는 Google의 웹 크롤러 봇과 독점적으로 연관되어 있음을 알아 냈습니다. 사용자 에이전트 필드에서 "googlebot"으로 요청을 무시하기 시작하자마자 충돌이 사라졌습니다. JS 스크립트의 결과를 약간의 지능적인 방식으로 캐시해야하며, 최종 결과는 스파이더 브라우저가 정상적인 브라우저와 같은 방식으로 작동 할 수 없다는 것입니다.

      FYI 일뿐입니다.

    • 답변 # 4

      이 질문을 귀하의 질문에 대한 의견으로 게시하고 싶었지만 StackOverflow가 허용하지 않습니다.

      방금 게시 한 UUID 알고리즘을 사용하여 Chrome에서 100,000 회의 반복 테스트를 수행했으며 충돌이 없었습니다. 다음은 코드 스 니펫입니다.

      var createGUID = function() {
          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 testGUIDs = function(upperlimit) {
          alert('Doing collision test on ' + upperlimit + ' GUID creations.');
          var i=0, guids=[];
          while (i++<upperlimit) {
              var guid=createGUID();
              if (guids.indexOf(guid)!=-1) {
                  alert('Collision with ' + guid + ' after ' + i + ' iterations');
              }
              guids.push(guid);
          }
          alert(guids.length + ' iterations completed.');
      }
      testGUIDs(100000);
      
      

      여기에 다른 일이 없습니까?

    • 답변 # 5

      이 UUID 솔루션을 처음 게시 한 답변은 2017-06-28에 업데이트되었습니다 :

      와이즈 비즈 와이즈 비즈  API 및 약간의 JS 마법사는 다음과 같은 크레딧을 얻을 수 없습니다.

      A good article from Chrome developers discussing the state of Math.random PRNG quality in Chrome, Firefox, and Safari. tl;dr - As of late-2015 it's "pretty good", but not cryptographic quality. To address that issue, here's an updated version of the above solution that uses ES6, the

      crypto

  • 이전 R 패키지 Edgar를 사용하여 10K 보고서에서 비즈니스 설명을 추출 할 때 오류가 발생하는 이유는 무엇입니까?
  • 다음 json - 사이트에서 나머지 API를 자주 사용하는 Java 애플리케이션이있는 데이터베이스가 필요합니까?