Tôi đang làm việc trên một hệ thống tạo ra khoảng 2 tỷ UUID duy nhất mỗi ngày. UUID được tạo bằng JavaScript \ Flash (AS3) trên máy khách.Tạo các UUID thực sự độc đáo trong JavaScript và AS3 - PRNG và các thuật toán cơ bản
Gần đây chúng tôi nhận thấy rằng các UUID của chúng tôi không có nơi gần độc đáo. Chúng tôi có khoảng 20% (!) Bản sao hàng ngày, hầu hết trong số đó (liên quan đến lưu lượng truy cập) đến từ chrome.
Tôi đã thực hiện some readingand learnedthat the pseudo-random triển khai thuật toán thế hệ (PRNG) trên hầu hết các trình duyệt và đặc biệt là chrome, là thiếu sót. Chromium và Node.js sử dụng công cụ V8Script V8, thực hiện một thuật toán gọi là MWC1616. Theo lý thuyết, UUID được tạo ra bằng cách sử dụng PRNG tốt phải có 2132 probability cho va chạm, nhưng với MWC1616, trong một số trường hợp rất thực tế, xác suất này là khoảng 1: 30000.
Để giải quyết vấn đề, tôi coi các tùy chọn sau:
- Tạo ID trên máy chủ (sử dụng Go)
- Tạo một ID mạnh trên máy khách, bằng cách băm một số thông tin như IP, UA , dấu thời gian, v.v. với UUID.
- Thay thế Math.random() bằng trình tạo ngẫu nhiên tốt hơn.
Vì tôi muốn giữ chúng trên máy khách và tôi không muốn tái phát minh ra bánh xe và sửa đổi logic tạo UUID, tôi muốn gắn bó với tùy chọn 3.
Tin tốt lành là trên các trình duyệt mới hơn, có api getRandomValues. Thật không may, tôi cần hỗ trợ các trình duyệt cũ hơn.
Vì vậy, câu hỏi của tôi là:
- một tốt và đáng tin cậy polyfill JavaScript cho
crypto.getRandomValues ()
(mà không sử dụng Math là gì .random nội bộ)?
AS3 Math.random() có sử dụng Math.random() của trình duyệt không? Liệu nó có thực hiện cùng một thuật toán không?
Flash.crypto.generateRandomBytes() có sử dụng Math.random() không? Nó có sử dụng crypto.getRandomValues () không? Nếu không, thuật toán nào nó thực hiện và nó sẽ là một giải pháp tốt cho cùng một vấn đề trong AS3? Nếu không, bạn nên giới thiệu thư viện mã hóa AS3 nào?
P.S. Tôi đánh giá cao các bài viết tôi đã đề cập -1--2--3-. Tôi đã nhận thức được các vấn đề với Math.random() trong nhiều năm, nhưng bài viết này thực sự làm cho nó rõ ràng với tôi cho tốt.
Math.random() của AS3 là trình duyệt độc lập nhưng vẫn giả ngẫu nhiên. AS3 có một phương thức UIDUtil.createUID() nhưng như đã nêu trong các tài liệu "UID này sẽ không thực sự độc đáo trên toàn cầu, nhưng tốt nhất chúng ta có thể làm mà không cần hỗ trợ trình phát để tạo UID". Tôi đang sử dụng lớp này cho thế hệ GUID và nó hoạt động khá tốt cho đến nay (với vài nghìn ID được tạo mỗi ngày): http://snipplr.com/view/45247/as3-globally-unique-identifier-guid/ – Philarmon
@Philarmon - Tôi nghi ngờ điều này sẽ không đủ tốt cho tải của chúng tôi - Việc triển khai UIDUtil rất giống với việc triển khai hiện tại tôi đang sử dụng Math.random. Bạn có kinh nghiệm với crypto.generateRandomBytes không? – Lizozom
Hãy thử 'forge.random.getBytesSync (numbytes);' Có vẻ là [random.js] của forges (https://github.com/digitalbazaar/forge/blob/master/lib/random.js) sử dụng trình tạo ngẫu nhiên của riêng nó khi ' window.crypto.getRandomValues () 'không có sẵn và có thể bị buộc sử dụng' forge.options.usePureJavaScript = true; ' – pedrofb