Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Rủi ro xung đột UUID sử dụng các thuật toán khác nhau

Rủi ro va chạm được tăng lên một chút nhưng vẫn biến mất rất nhỏ. Hãy xem xét điều đó:

  • Cả Comb và NEWID / NEWSEQUENTIALID bao gồm một dấu thời gian với độ chính xác xuống một vài mili giây. Do đó, trừ khi bạn đang tạo một số lượng lớn ID vào cùng một thời điểm chính xác từ tất cả các nguồn khác nhau này, điều đó thực sự là không thể để các ID xung đột.

  • Phần của GUID mà không phải dựa trên dấu thời gian có thể được coi là ngẫu nhiên; hầu hết các thuật toán GUID đều dựa trên các chữ số này dựa trên PRNG. Do đó, khả năng xảy ra va chạm giữa 10 byte khác này theo thứ tự giống như khi bạn sử dụng hai trình tạo số ngẫu nhiên riêng biệt và theo dõi xung đột.

    Hãy suy nghĩ về điều này một chút - PRNG có thể và thực hiện các số lặp lại, do đó, khả năng xảy ra va chạm giữa hai trong số chúng không cao hơn đáng kể so với va chạm chỉ sử dụng một trong số chúng, ngay cả khi chúng sử dụng các thuật toán hơi khác nhau. Nó giống như chơi cùng một số xổ số hàng tuần so với chọn một bộ ngẫu nhiên mỗi tuần - tỷ lệ chiến thắng hoàn toàn giống nhau.

Bây giờ, hãy nhớ rằng khi bạn sử dụng một thuật toán như Guid.Comb, bạn chỉ có 10 bit giá trị duy nhất, tương đương với 1024 giá trị riêng biệt. Vì vậy, nếu bạn đang tạo ra một số lượng lớn GUID trong cùng một vài mili giây, bạn sẽ bị va chạm. Nhưng nếu bạn tạo GUID với tần suất khá thấp, thì việc bạn sử dụng bao nhiêu thuật toán khác nhau cùng một lúc không thực sự quan trọng, khả năng xảy ra va chạm trên thực tế vẫn không tồn tại.

Cách tốt nhất để bạn hoàn toàn chắc chắn là chạy thử nghiệm; có tất cả 2 hoặc 3 (hoặc tuy nhiên bạn sử dụng nhiều) tạo GUID, đồng thời, theo khoảng thời gian đều đặn, và ghi chúng ra tệp nhật ký và xem liệu bạn có bị va chạm hay không (và nếu có, thì có bao nhiêu). Điều đó sẽ cung cấp cho bạn một ý tưởng tốt về mức độ an toàn của điều này trong thực tế.

P.S. Nếu bạn đang sử dụng trình tạo lược của NHibernate để tạo GUID cho khóa chính được phân nhóm, hãy xem xét sử dụng NEWSEQUENTIALID() thay vì NEWID() - toàn bộ điểm của Comb là tránh chia tách trang và bạn sẽ không đạt được điều đó nếu bạn có các quy trình khác sử dụng các thuật toán không tuần tự. Bạn cũng nên thay đổi bất kỳ mã nào bằng cách sử dụng Guid.NewGuid để sử dụng cùng một trình tạo Comb - thuật toán Comb thực tế được sử dụng trong NHibernate không phức tạp và dễ trùng lặp trong logic miền của riêng bạn.

† Lưu ý rằng dường như có một số tranh chấp về NEWID và nó có chứa dấu thời gian hay không. Trong mọi trường hợp, vì nó dựa trên địa chỉ MAC, phạm vi giá trị có thể có nhỏ hơn đáng kể so với V4 GUID hoặc Comb. Thêm lý do để tôi khuyên bạn nên gắn bó với Comb GUIDs bên ngoài cơ sở dữ liệu và NEWSEQUENTIALID bên trong cơ sở dữ liệu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thủ tục mong đợi tham số không được cung cấp

  2. IO STATISTICS trong SQL Server là gì?

  3. Tìm các thực thể tham chiếu trong SQL Server:sys.dm_sql_referencing_entities ()

  4. Cách chuyển đổi dấu thời gian Unix thành giá trị ngày / giờ trong SQL Server

  5. Chức năng định dạng ngày của SQL Server