UUID độc đáo như thế nào?


450

Làm thế nào an toàn để sử dụng UUID để xác định duy nhất một cái gì đó (Tôi đang sử dụng nó cho các tệp được tải lên máy chủ)? Theo tôi hiểu, nó dựa trên những con số ngẫu nhiên. Tuy nhiên, dường như với tôi khi có đủ thời gian, cuối cùng nó sẽ tự lặp lại, chỉ bằng cơ hội thuần túy. Có một hệ thống tốt hơn hoặc một mô hình của một số loại để giảm bớt vấn đề này?


11
Đối với một giá trị đủ lớn của "đủ thời gian" :)

91
"UUID độc đáo như thế nào?" Toàn cầu độc đáo, tôi tin. ;)
Miles

29
Và trừ khi bạn có kế hoạch phát triển trên Sao Kim, một GUID sẽ đủ.
skaffman

1
biết thêm chi tiết và trình tạo tại đây: trình tạo uuid trực tuyến
Dave

2
"Độc nhất" có nghĩa là không bao giờ va chạm . Nếu nó có bất kỳ khả năng va chạm nào, nó không phải là duy nhất . Do đó, theo định nghĩa, UUID không phải là duy nhất và chỉ an toàn nếu bạn chuẩn bị cho các va chạm tiềm năng bất kể cơ hội va chạm. Nếu không, chương trình của bạn chỉ đơn giản là không chính xác. Bạn có thể nói UUID là "gần như duy nhất" nhưng điều đó không có nghĩa là "duy nhất".
Eonil

Câu trả lời:


444

Rất an toàn:

rủi ro hàng năm của một người nhất định bị thiên thạch đâm vào được ước tính là một cơ hội trong 17 tỷ, điều đó có nghĩa là xác suất là khoảng 0,000000006 (6 × 10 11 ), tương đương với tỷ lệ tạo ra vài chục nghìn tỷ UUID trong một năm và có một bản sao. Nói cách khác, chỉ sau khi tạo ra 1 tỷ UUID mỗi giây trong 100 năm tiếp theo, xác suất tạo ra chỉ một bản sao sẽ là khoảng 50%.

Hãy cẩn thận:

Tuy nhiên, các xác suất này chỉ giữ khi các UUID được tạo bằng cách sử dụng đủ entropy. Mặt khác, xác suất trùng lặp có thể cao hơn đáng kể, vì độ phân tán thống kê có thể thấp hơn. Khi các số nhận dạng duy nhất được yêu cầu cho các ứng dụng phân tán, để UUID không xung đột ngay cả khi dữ liệu từ nhiều thiết bị được hợp nhất, tính ngẫu nhiên của các hạt và máy phát được sử dụng trên mọi thiết bị phải đáng tin cậy cho tuổi thọ của ứng dụng. Trong trường hợp điều này không khả thi, RFC4122 khuyên bạn nên sử dụng biến thể không gian tên thay thế.

Nguồn: Xác suất UUID ngẫu nhiên của phần trùng lặp trong bài viết Wikipedia về số nhận dạng duy nhất toàn cầu (liên kết dẫn đến sửa đổi từ tháng 12 năm 2016 trước khi chỉnh sửa lại phần này).

Đồng thời xem phần hiện tại về cùng một chủ đề trên cùng một bài viết định danh duy nhất toàn cầu, Va chạm .


22
Tôi thích phần này từ Wikipedia: Tuy nhiên, các xác suất này chỉ được giữ khi các UUID được tạo bằng cách sử dụng đủ entropy. Mặt khác, xác suất trùng lặp có thể cao hơn đáng kể, vì độ phân tán thống kê có thể thấp hơn. Vì vậy, cơ hội thực sự của trùng lặp lưu ý câu này là gì. Chúng ta không thể tạo số ngẫu nhiên thực sự trên máy tính, phải không?
mans

6
Trên thực tế, rất nhiều công việc đã đi vào việc tìm cách giới thiệu càng nhiều entropy ("tính ngẫu nhiên thực sự", tôi đoán bạn sẽ gọi nó) càng tốt vào API số ngẫu nhiên. Xem en.wikipedia.org/wiki/Entropy_%28computing%29
broofa

4
Đó thực sự là một xác suất va chạm cao hơn tôi tưởng tượng. Nghịch lý sinh nhật tại, tôi đoán.
Cameron

Bạn có thể xác nhận rằng sử dụng UUID sẽ an toàn giữa các lần thực thi ứng dụng không? (ví dụ: tập lệnh python)
George Sp

ví dụ tuyệt vời ...: D
NuttLoose

151

Nếu bằng cách "cho đủ thời gian", bạn có nghĩa là 100 năm và bạn đang tạo ra chúng với tốc độ một tỷ một giây, thì có, bạn có 50% khả năng xảy ra va chạm sau 100 năm.


185
Nhưng chỉ sau khi sử dụng tối đa 256 exabyte dung lượng cho những ID đó.
Bob Aman

16
Điều thú vị là, bạn có thể tạo ra 2 liên tiếp giống hệt nhau, tất nhiên ở mức độ trùng khớp ngẫu nhiên, may mắn và can thiệp thần thánh, mặc dù có những tỷ lệ không thể tưởng tượng được, nhưng vẫn có thể! : D Có, nó sẽ không xảy ra. chỉ nói để giải trí khi nghĩ về khoảnh khắc đó khi bạn tạo một bản sao! Ảnh chụp màn hình video!
scalable3

4
Là sự độc đáo hoàn toàn là do sự ngẫu nhiên? Hoặc có những yếu tố khác? (ví dụ: tem thời gian, ip, v.v.)
Weishi Zeng

15
@TheTahaan Đó không phải là ý nghĩa ngẫu nhiên. Nó không có nghĩa là "hoàn toàn không thể đoán trước" - thông thường họ tuân theo một số loại phân phối. Nếu bạn lật 10 đồng xu, cơ hội nhận được 2 đầu, theo sau là 3 đuôi, theo sau là 5 đầu, là khá thấp (2 ^ -10, khoảng 0,001). Điều đó thực sự ngẫu nhiên, nhưng chúng tôi hoàn toàn có thể biết cơ hội nhận được một kết quả cụ thể. Chúng tôi không thể nói trước liệu điều đó sẽ xảy ra.
Richard Rast

5
Chỉ để giải thích việc triển khai này đã làm gì sai, họ đang sử dụng UUID phiên bản 1, dựa trên sự kết hợp giữa dấu thời gian và địa chỉ mac vì tính độc đáo của nó. Tuy nhiên, nếu bạn tạo UUID đủ nhanh, dấu thời gian sẽ không tăng lên. Trong trường hợp này, thuật toán tạo UUID của bạn được cho là theo dõi dấu thời gian cuối cùng được sử dụng và tăng nó lên 1. Chúng rõ ràng không thực hiện bước đó. Tuy nhiên, tất cả các UUID phiên bản 1 được tạo chính xác bởi cùng một máy trong một khoảng thời gian ngắn sẽ thể hiện sự tương đồng rõ ràng, nhưng vẫn phải là duy nhất.
Bob Aman

103

Có nhiều loại UUID, vì vậy "mức độ an toàn" phụ thuộc vào loại (mà thông số kỹ thuật của UUID gọi là "phiên bản") mà bạn đang sử dụng.

  • Phiên bản 1 là thời gian dựa trên địa chỉ MAC UUID. 128 bit chứa 48 bit cho địa chỉ MAC của card mạng (được nhà sản xuất gán riêng) và đồng hồ 60 bit có độ phân giải 100 nano giây. Đồng hồ đó kết thúc tốt đẹp trong 3603 AD để những UUID này an toàn ít nhất cho đến lúc đó (trừ khi bạn cần hơn 10 triệu UUID mới mỗi giây hoặc ai đó sao chép thẻ mạng của bạn). Tôi nói "ít nhất" bởi vì đồng hồ bắt đầu vào ngày 15 tháng 10 năm 1582, vì vậy bạn có khoảng 400 năm sau khi đồng hồ kết thúc trước khi có một khả năng trùng lặp nhỏ.

  • Phiên bản 4 là số ngẫu nhiên UUID. Có sáu bit cố định và phần còn lại của UUID là 122 bit ngẫu nhiên. Xem Wikipedia hoặc phân tích khác mô tả mức độ khó có thể trùng lặp.

  • Phiên bản 3 đang sử dụng MD5 và Phiên bản 5 sử dụng SHA-1 để tạo 122 bit đó, thay vì bộ tạo số ngẫu nhiên hoặc giả ngẫu nhiên. Vì vậy, về mặt an toàn, nó giống như Phiên bản 4 là một vấn đề thống kê (miễn là bạn chắc chắn rằng thuật toán digest đang xử lý luôn là duy nhất).

  • Phiên bản 2 tương tự như Phiên bản 1, nhưng với đồng hồ nhỏ hơn nên nó sẽ được bọc xung quanh sớm hơn nhiều. Nhưng vì UUID phiên bản 2 dành cho DCE, bạn không nên sử dụng chúng.

Vì vậy, đối với tất cả các vấn đề thực tế, họ được an toàn. Nếu bạn không thoải mái với việc để nó có xác suất (ví dụ: bạn là kiểu người lo lắng về việc trái đất bị phá hủy bởi một tiểu hành tinh lớn trong đời bạn), chỉ cần đảm bảo bạn sử dụng UUID Phiên bản 1 và nó được đảm bảo là duy nhất ( trong cuộc đời của bạn, trừ khi bạn có kế hoạch sống qua 3603 sau Công nguyên).

Vậy tại sao mọi người không sử dụng UUID phiên bản 1? Đó là bởi vì UUID phiên bản 1 tiết lộ địa chỉ MAC của máy được tạo và chúng có thể dự đoán được - hai điều có thể có ý nghĩa bảo mật cho ứng dụng sử dụng các UUID đó.


1
Mặc định cho UUID phiên bản 1 có vấn đề nghiêm trọng khi chúng được tạo bởi cùng một máy chủ cho nhiều người. UUID phiên bản 4 là mặc định của tôi vì bạn có thể nhanh chóng viết một cái gì đó để tạo một thứ trong bất kỳ ngôn ngữ hoặc nền tảng nào (bao gồm cả javascript).
Justin Bozonier

1
@Hoylen Giải thích rõ! Nhưng điều này có quá mức cường điệu không?
Dinoop paloli

1
Về mặt lý thuyết , nó được chỉ định duy nhất bởi nhà sản xuất.
OrangeDog

4
Một người không cần tạo 10 triệu UUID phiên bản 1 giây trong một giây để gặp phải bản sao; người ta chỉ cần tạo ra một lô 16.384 UUID trong phạm vi của một "đánh dấu" duy nhất để vượt qua số thứ tự. Tôi đã thấy điều này xảy ra với một triển khai dựa trên nguồn đồng hồ (1) có độ chi tiết cấp độ và (2) không được đảm bảo là đơn điệu (đồng hồ hệ thống thì không). Hãy cẩn thận với mã tạo UUID mà bạn sử dụng và đặc biệt cảnh giác với các trình tạo UUID dựa trên thời gian. Chúng rất khó để lấy đúng, vì vậy hãy kiểm tra chúng trước khi sử dụng chúng.
Mike Strobel

Khoảng thời gian giữa các UUID v4 được tạo có thể dẫn đến xác suất va chạm nhiều hơn không? Ý tôi là trong một ứng dụng giao thông nặng, giả sử hàng ngàn uuids được tạo ra cùng một lúc, liệu có nhiều khả năng va chạm hơn nếu cùng một lượng uuids được tạo ra trong một khoảng thời gian tương đối dài hơn không?
Jonathan

18

Câu trả lời cho điều này có thể phụ thuộc phần lớn vào phiên bản UUID.

Nhiều trình tạo UUID sử dụng số ngẫu nhiên phiên bản 4. Tuy nhiên, nhiều trong số này sử dụng Pseudo a Random Number Generator để tạo chúng.

Nếu một PRNG được gieo hạt kém với một khoảng thời gian nhỏ được sử dụng để tạo UUID, tôi sẽ nói rằng nó không an toàn chút nào.

Do đó, nó chỉ an toàn như các thuật toán được sử dụng để tạo ra nó.

Mặt khác, nếu bạn biết câu trả lời cho những câu hỏi này thì tôi nghĩ rằng một phiên bản 4 uuid nên rất an toàn để sử dụng. Trong thực tế, tôi đang sử dụng nó để xác định các khối trên hệ thống tệp khối mạng và cho đến nay vẫn chưa có xung đột.

Trong trường hợp của tôi, PRNG mà tôi đang sử dụng là một twister mersenne và tôi cẩn thận với cách nó được tạo ra từ nhiều nguồn bao gồm / dev / urandom. Mersenne twister có khoảng thời gian là 2 ^ 19937 - 1. Sẽ còn rất lâu nữa tôi mới thấy một uuid lặp lại.


14

Trích dẫn từ Wikipedia :

Do đó, bất kỳ ai cũng có thể tạo UUID và sử dụng nó để xác định một cái gì đó với độ tin cậy hợp lý rằng mã định danh sẽ không bao giờ được sử dụng một cách vô tình bởi bất cứ ai cho bất cứ điều gì khác

Nó tiếp tục giải thích chi tiết khá tốt về mức độ an toàn thực sự của nó. Vì vậy, để trả lời câu hỏi của bạn: Có, nó đủ an toàn.


9

Tôi đồng tình với các câu trả lời khác. UUID đủ an toàn cho gần như tất cả các mục đích thực tế 1 , và chắc chắn cho bạn.

Nhưng giả sử (giả thuyết) rằng họ không.

Có một hệ thống tốt hơn hoặc một mô hình của một số loại để giảm bớt vấn đề này?

Dưới đây là một vài cách tiếp cận:

  1. Sử dụng UUID lớn hơn. Chẳng hạn, thay vì 128 bit ngẫu nhiên, sử dụng 256 hoặc 512 hoặc ... Mỗi bit bạn thêm vào UUID kiểu 4 sẽ giảm xác suất va chạm xuống một nửa, giả sử rằng bạn có nguồn entropy đáng tin cậy 2 .

  2. Xây dựng một dịch vụ tập trung hoặc phân tán để tạo UUID và ghi lại từng dịch vụ mà nó đã từng phát hành. Mỗi lần nó tạo ra một cái mới, nó sẽ kiểm tra xem UUID chưa bao giờ được cấp trước đó. Một dịch vụ như vậy sẽ đơn giản về mặt kỹ thuật để thực hiện (tôi nghĩ) nếu chúng tôi cho rằng những người điều hành dịch vụ này hoàn toàn đáng tin cậy, không thể phá hoại, vân vân. Thật không may, họ không ... đặc biệt là khi có khả năng các tổ chức an ninh của chính phủ can thiệp. Vì vậy, cách tiếp cận này có lẽ là không thực tế, và có thể là 3 điều không thể trong thế giới thực.


1 - Nếu tính duy nhất của UUID xác định liệu tên lửa hạt nhân có được phóng tại thành phố thủ đô của bạn hay không, rất nhiều đồng bào của bạn sẽ không bị thuyết phục bởi "xác suất cực kỳ thấp". Do đó trình độ "gần như tất cả" của tôi.

2 - Và đây là một câu hỏi triết học cho bạn. Có bất cứ điều gì thực sự ngẫu nhiên? Làm sao chúng ta biết nếu không? Là vũ trụ như chúng ta biết nó là một mô phỏng? Có một vị thần nào có thể hình dung "điều chỉnh" các định luật vật lý để thay đổi kết quả không?

3 - Nếu bất cứ ai biết về bất kỳ tài liệu nghiên cứu về vấn đề này, xin vui lòng bình luận.


Tôi chỉ muốn chỉ ra rằng phương pháp số 2 về cơ bản đánh bại mục đích chính của việc sử dụng UUID và bạn cũng có thể chỉ sử dụng một ID được đánh số cổ điển tại thời điểm đó.
Petr Vnenk

Tôi không đồng ý. Lỗ hổng trong ID được đánh số liên tiếp là chúng quá dễ đoán. Bạn sẽ có thể thực hiện phương pháp 2 theo cách làm cho các UUID khó đoán.
Stephen C

8

Các lược đồ UUID thường sử dụng không chỉ một yếu tố giả ngẫu nhiên, mà cả thời gian hệ thống hiện tại và một số ID phần cứng thường duy nhất nếu có, như địa chỉ MAC của mạng.

Toàn bộ quan điểm của việc sử dụng UUID là bạn tin tưởng nó sẽ thực hiện công việc cung cấp một ID duy nhất tốt hơn chính bạn có thể làm. Đây là lý do tương tự đằng sau việc sử dụng thư viện mật mã của bên thứ 3 thay vì sử dụng thư viện của riêng bạn. Tự làm điều đó có thể thú vị hơn, nhưng nó thường ít trách nhiệm hơn để làm điều đó.


5

Được làm việc đó trong nhiều năm. Không bao giờ chạy vào một vấn đề.

Tôi thường thiết lập DB của mình để có một bảng chứa tất cả các khóa và ngày sửa đổi, v.v. Không gặp phải vấn đề về các khóa trùng lặp.

Hạn chế duy nhất mà nó có là khi bạn viết một số truy vấn để tìm một số thông tin một cách nhanh chóng, bạn đang thực hiện nhiều thao tác sao chép và dán các phím. Bạn không có id ngắn dễ nhớ nữa.


5

Đây là một đoạn thử nghiệm để bạn kiểm tra nó là duy nhất. lấy cảm hứng từ bình luận của @ scalabl3

Điều thú vị là, bạn có thể tạo ra 2 liên tiếp giống hệt nhau, tất nhiên ở mức độ trùng khớp ngẫu nhiên, may mắn và can thiệp thần thánh, mặc dù có những tỷ lệ không thể tưởng tượng được, nhưng vẫn có thể! : D Có, nó sẽ không xảy ra. chỉ nói để giải trí khi nghĩ về khoảnh khắc đó khi bạn tạo một bản sao! Ảnh chụp màn hình video! - scalable3 ngày 20 tháng 10 năm 15 lúc 19:11

Nếu bạn cảm thấy may mắn, hãy chọn hộp kiểm, nó chỉ kiểm tra id hiện đang được tạo. Nếu bạn muốn kiểm tra lịch sử, hãy bỏ chọn nó. Xin lưu ý, bạn có thể hết ram tại một số điểm nếu bạn không chọn nó. Tôi đã cố gắng làm cho nó thân thiện với cpu để bạn có thể hủy bỏ nhanh chóng khi cần, chỉ cần nhấn nút chạy lại hoặc rời khỏi trang.

Math.log2 = Math.log2 || function(n){ return Math.log(n) / Math.log(2); }
  Math.trueRandom = (function() {
  var crypt = window.crypto || window.msCrypto;

  if (crypt && crypt.getRandomValues) {
      // if we have a crypto library, use it
      var random = function(min, max) {
          var rval = 0;
          var range = max - min;
          if (range < 2) {
              return min;
          }

          var bits_needed = Math.ceil(Math.log2(range));
          if (bits_needed > 53) {
            throw new Exception("We cannot generate numbers larger than 53 bits.");
          }
          var bytes_needed = Math.ceil(bits_needed / 8);
          var mask = Math.pow(2, bits_needed) - 1;
          // 7776 -> (2^13 = 8192) -1 == 8191 or 0x00001111 11111111

          // Create byte array and fill with N random numbers
          var byteArray = new Uint8Array(bytes_needed);
          crypt.getRandomValues(byteArray);

          var p = (bytes_needed - 1) * 8;
          for(var i = 0; i < bytes_needed; i++ ) {
              rval += byteArray[i] * Math.pow(2, p);
              p -= 8;
          }

          // Use & to apply the mask and reduce the number of recursive lookups
          rval = rval & mask;

          if (rval >= range) {
              // Integer out of acceptable range
              return random(min, max);
          }
          // Return an integer that falls within the range
          return min + rval;
      }
      return function() {
          var r = random(0, 1000000000) / 1000000000;
          return r;
      };
  } else {
      // From http://baagoe.com/en/RandomMusings/javascript/
      // Johannes Baagøe <baagoe@baagoe.com>, 2010
      function Mash() {
          var n = 0xefc8249d;

          var mash = function(data) {
              data = data.toString();
              for (var i = 0; i < data.length; i++) {
                  n += data.charCodeAt(i);
                  var h = 0.02519603282416938 * n;
                  n = h >>> 0;
                  h -= n;
                  h *= n;
                  n = h >>> 0;
                  h -= n;
                  n += h * 0x100000000; // 2^32
              }
              return (n >>> 0) * 2.3283064365386963e-10; // 2^-32
          };

          mash.version = 'Mash 0.9';
          return mash;
      }

      // From http://baagoe.com/en/RandomMusings/javascript/
      function Alea() {
          return (function(args) {
              // Johannes Baagøe <baagoe@baagoe.com>, 2010
              var s0 = 0;
              var s1 = 0;
              var s2 = 0;
              var c = 1;

              if (args.length == 0) {
                  args = [+new Date()];
              }
              var mash = Mash();
              s0 = mash(' ');
              s1 = mash(' ');
              s2 = mash(' ');

              for (var i = 0; i < args.length; i++) {
                  s0 -= mash(args[i]);
                  if (s0 < 0) {
                      s0 += 1;
                  }
                  s1 -= mash(args[i]);
                  if (s1 < 0) {
                      s1 += 1;
                  }
                  s2 -= mash(args[i]);
                  if (s2 < 0) {
                      s2 += 1;
                  }
              }
              mash = null;

              var random = function() {
                  var t = 2091639 * s0 + c * 2.3283064365386963e-10; // 2^-32
                  s0 = s1;
                  s1 = s2;
                  return s2 = t - (c = t | 0);
              };
              random.uint32 = function() {
                  return random() * 0x100000000; // 2^32
              };
              random.fract53 = function() {
                  return random() +
                      (random() * 0x200000 | 0) * 1.1102230246251565e-16; // 2^-53
              };
              random.version = 'Alea 0.9';
              random.args = args;
              return random;

          }(Array.prototype.slice.call(arguments)));
      };
      return Alea();
  }
}());

Math.guid = function() {
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c)    {
      var r = Math.trueRandom() * 16 | 0,
          v = c == 'x' ? r : (r & 0x3 | 0x8);
      return v.toString(16);
  });
};
function logit(item1, item2) {
    console.log("Do "+item1+" and "+item2+" equal? "+(item1 == item2 ? "OMG! take a screenshot and you'll be epic on the world of cryptography, buy a lottery ticket now!":"No they do not. shame. no fame")+ ", runs: "+window.numberofRuns);
}
numberofRuns = 0;
function test() {
   window.numberofRuns++;
   var x = Math.guid();
   var y = Math.guid();
   var test = x == y || historyTest(x,y);

   logit(x,y);
   return test;

}
historyArr = [];
historyCount = 0;
function historyTest(item1, item2) {
    if(window.luckyDog) {
       return false;
    }
    for(var i = historyCount; i > -1; i--) {
        logit(item1,window.historyArr[i]);
        if(item1 == history[i]) {
            
            return true;
        }
        logit(item2,window.historyArr[i]);
        if(item2 == history[i]) {
            
            return true;
        }

    }
    window.historyArr.push(item1);
    window.historyArr.push(item2);
    window.historyCount+=2;
    return false;
}
luckyDog = false;
document.body.onload = function() {
document.getElementById('runit').onclick  = function() {
window.luckyDog = document.getElementById('lucky').checked;
var val = document.getElementById('input').value
if(val.trim() == '0') {
    var intervaltimer = window.setInterval(function() {
         var test = window.test();
         if(test) {
            window.clearInterval(intervaltimer);
         }
    },0);
}
else {
   var num = parseInt(val);
   if(num > 0) {
        var intervaltimer = window.setInterval(function() {
         var test = window.test();
         num--;
         if(num < 0 || test) {
    
         window.clearInterval(intervaltimer);
         }
    },0);
   }
}
};
};
Please input how often the calulation should run. set to 0 for forever. Check the checkbox if you feel lucky.<BR/>
<input type="text" value="0" id="input"><input type="checkbox" id="lucky"><button id="runit">Run</button><BR/>


Thử với UUID RFC 4122 Phiên bản 1 (ngày và địa chỉ MAC) UUID.
zaph

Nó được sử dụng để được nhanh chóng, cho đến khi một bản cập nhật chrome gần đây. Tôi đã nhận thấy điều tương tự 4 tuần trước.
Tschallacka

3

Tôi không biết điều này có quan trọng với bạn không, nhưng hãy nhớ rằng GUID là duy nhất trên toàn cầu, nhưng các chuỗi con của GUID thì không .


1
Hãy nhớ rằng tài liệu tham khảo được liên kết ở đây nói về UUID phiên bản 1 (lấy thông tin về máy tính tạo, v.v. vào id). Hầu hết các câu trả lời khác nói về Phiên bản 4 (hoàn toàn ngẫu nhiên). Bài viết Wikipedia được liên kết ở trên en.wikipedia.org/wiki/Universally_unique_identifier giải thích các loại UUID khác nhau.
kratenko

3

Đối với UUID4 tôi làm cho nó có khoảng ID nhiều như có những hạt cát trong một hộp hình khối có cạnh dài 360.000km. Đó là một hộp có cạnh dài hơn 2 1/2 lần so với đường kính của Sao Mộc.

Làm việc để ai đó có thể cho tôi biết nếu tôi làm hỏng các đơn vị:

  • khối lượng hạt cát 0,00947mm ^ 3 ( Người bảo vệ )
  • UUID4 có 122 bit ngẫu nhiên -> 5,3e36 giá trị có thể ( wikipedia )
  • khối lượng của nhiều hạt cát = 5,0191e34 mm ^ 3 hoặc 5,0191e + 25m ^ 3
  • chiều dài cạnh của hộp hình khối với khối lượng đó = 3,69E8m hoặc 369.000km
  • đường kính của Sao Mộc: 139.820km (google)

Trên thực tế tôi đoán điều này giả định đóng gói 100% vì vậy có lẽ tôi nên thêm một yếu tố cho điều đó!
mất
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.