2009-07-02 16 views
16

Tôi đang cố gắng tìm ra cách "thông minh" và "an toàn" để tạo ra khoảng 63 triệu mã duy nhất được sử dụng trong một cuộc thi. Các mã sẽ dài khoảng 10 ký tự.Cách tạo 63 triệu mã số giải thưởng

Có ai đã làm bất cứ điều gì tương tự hoặc nhận thức được bất kỳ "rào cản" nào có thể phát sinh từ vấn đề này không? Làm cách nào để chúng tôi giảm thiểu xác suất ai đó có thể đoán mã?

Dự án này sẽ được thực hiện bằng PHP, nhưng điều đó sẽ không thực sự quan trọng, đó là nhiều logic hơn là vấn đề ở đây.

Mọi phản hồi sẽ thực sự được đánh giá cao.

CẬP NHẬT Chỉ cần làm rõ nó sẽ là 10 ký tự của case insensitive Giá trị Số Alpha. A-Z0-9

Trả lời

30

Cú pháp:

Bạn có thể sẽ có những người sao chép các mã, do đó có nghĩa các mã nên dễ sao chép. 10^10 quá nhỏ, như Gamecat chỉ ra. kgiannakakis có một ý tưởng tốt hơn, nhưng điều đó gây ra một vấn đề khác: "1" trông rất giống "Tôi". "0", "C", "O" và "Q" cũng khá giống nhau. Đây không phải là một vấn đề lớn. Xác định alfabet an toàn: "ABDEFGHJKLMNPRSTUVXYZ" (bỏ COIQ) Từ nhận xét: tùy thuộc vào phông chữ bạn chọn, 5/S và U/V cũng có thể không rõ ràng về mặt hình ảnh; thay thế theo yêu cầu. Đây là mã 32 ký tự (5 bit). Mã gồm 10 ký tự là số 50 bit. Những người nên được khá tầm thường để tạo ra, sắp xếp, sao chép, so sánh vv Cơ hội được đoán là khoảng 0,63E-7

Vì mã quá dài nên nhớ, người dùng sẽ cần một điểm nghỉ khi sao chép chúng. Vì vậy, chia chuỗi thành hai hoặc ba phần và đảm bảo trường nhập khớp với phân tích này.

Ví dụ: AKG3L-45TEE => hai nhóm 5, và thậm chí nếu bạn không thể nhớ 5 ký tự thì việc tìm lại điểm mà bạn đã ngừng đọc trở nên dễ dàng hơn rất nhiều.


Làm thế nào để tạo ra chúng:

này khá đơn giản. Bạn không cần một thuật toán đặc biệt nhị phân để tạo ra các ứng cử viên. Bạn có thể tạo 10 số ngẫu nhiên trên mỗi mã cần thiết, mất 5 bit từ mỗi số (thường là các bit giữa là tốt nhất, ví dụ: (rand()/64) modulo 32). Sử dụng giá trị này [0-31] làm chỉ mục vào bảng chữ cái của bạn. Tạo một bảng cơ sở dữ liệu với chuỗi này làm khóa chính và chèn cho đến khi bảng có 63 triệu mục nhập. Bạn có thể muốn thêm ngày "được tạo vào" và "được đổi vào" vào bảng này.

+8

+1 Điểm tốt về việc loại bỏ các giá trị khó hiểu –

+0

Và có 32 biểu tượng có thể đơn giản hóa một số thứ quá –

+4

Chữ cái 'S' và số năm '5' cũng là đồng cấu. – dwhall

0

Sử dụng trình tạo số ngẫu nhiên an toàn.

+1

Xác suất đoán: 63 * 10^6/10^10 = 1/159 – kgiannakakis

+1

i dunno cách người nào đó +1 về điều này vì nó hơi vô ích nếu không phần nào bảo trợ :) –

+0

Tôi không nghĩ ai đã nói nhân vật phải là số. [0-9a-z] cấp 63 * 10^6/36^10 = 17/1000000000. [0-9a-Z] cấp 63 * 10^6/62^10 = 75/1000000000000. –

0

nếu chúng dành cho người tham gia duy nhất, bạn có thể băm từng tên người tham gia (và/hoặc) chi tiết và sau đó cắt cho đến 10 ký tự đầu tiên.

+1

Hashes, về mặt kỹ thuật, có thể không phải lúc nào cũng là duy nhất. – Sampson

+0

Mã sẽ được phân phối trên các sản phẩm và sau đó được xác nhận quyền sở hữu, do đó không có kết nối với người tham gia để tạo các giá trị. –

+0

@Shadi - oh. lời xin lỗi của tôi sau đó. @ Jonathan - chắc chắn, đó là lý do tại sao tôi yêu cầu anh ta thêm nhiều chi tiết hơn vào việc tạo băm để làm cho chuỗi đầu vào đủ dài. mặc dù tôi không biết khả năng va chạm trong 63m sẽ cao bao nhiêu. Nhưng vẫn Câu trả lời khác tốt hơn nhiều. Tôi cũng không biết UUID. :) – OrangeRind

0

lẽ điều này sẽ giúp bạn một chút: Universal Unique Identifier

Mục đích của UUIDs là cho phép hệ thống phân phối để duy nhất xác định thông tin mà không phối hợp trung tâm đáng kể. Vì vậy, bất kỳ ai cũng có thể tạo UUID và sử dụng để xác định điều gì đó với số tin cậy hợp lý rằng mã định danh sẽ không bao giờ là vô ý được sử dụng bởi bất kỳ ai cho .

+1

sửa liên kết bạn quên thêm 'r' :) – OrangeRind

+1

vào UUID v4 đây chỉ là một sự lãng phí entropy - bạn đang vứt bỏ hầu hết dữ liệu. Trong các phiên bản UUID khác, dữ liệu có thể không quá ngẫu nhiên (địa chỉ MAC và thời gian hệ thống MAC - hoặc băm của chúng - không phải là nguồn dữ liệu ngẫu nhiên thực sự tốt). – drdaeman

+0

Ups nhờ ... damn Copy & Paste;) Yeah Tôi biết rằng nó thực sự là khá khó khăn cho một máy để tạo ra một số lượng lớn các số ngẫu nhiên. Tốt nhất cho một lượng lớn dữ liệu ngẫu nhiên thực sự có thể là lấy một số dữ liệu đo lường từ một thí nghiệm vật lý (phân rã phóng xạ) khiến chúng được cho là ngẫu nhiên ngẫu nhiên (ít nhất là hơn một máy phát điện). – Daff

2

Xem này link để tạo chuỗi alpha-số trong PHP. Nó sử dụng một bảng chữ cái 36 ký tự, đủ an toàn. Tuy nhiên tính duy nhất không được đảm bảo. Tôi đoán bạn có thể sử dụng một Set để thực hiện điều này. Vì đây chỉ là thao tác một lần nên thời gian trễ để kiểm tra các bản sao không phải là vấn đề lớn.

+0

Có bạn đã đúng, vì dữ liệu đang được thiết lập, không quá khó để kiểm tra xem mã có tồn tại khi đặt nó trong DB hay không và loại bỏ nó nếu không. –

+1

Tạo nhanh hơn 64 triệu mã, sắp xếp và kiểm tra các bản sao. Chỉ O (N log N). – MSalters

+0

@MSlaters: Bạn sẽ thực hiện kiểm tra trùng lặp như thế nào? –

5

Tạo một tập hợp các số 64 bit thực sự ngẫu nhiên, độc đáo trong phạm vi 0 - 2 -1. Bạn sẽ cần phải theo dõi những cái bạn đã thấy và từ chối các bản sao. Sử dụng mỗi 5 bit của 50 bit dưới của số này kéo từ bảng chữ cái 32 ký tự - về cơ bản tất cả các chữ cái trong bảng chữ cái tiếng Anh (chữ hoa hoặc chữ thường) trừ L và O cộng với các chữ số 2-9 (điều này làm giảm sự nhầm lẫn giữa l/1 và 0/O). Đối với 63 triệu mã, điều này sẽ cung cấp cho bạn xác suất 0,000006% (63.000.000/2) của việc chọn một chuỗi mã hợp lệ ngẫu nhiên.

Tôi cũng đã thực hiện việc này bằng cách sử dụng khóa tự động, khóa chính (int) và bit xen kẽ nó với giá trị ngẫu nhiên 32 bit. Trong trường hợp này, tôi đã sử dụng toàn bộ 64 bit để tạo 13 ký tự từ bảng chữ cái và thêm hai ký tự ngẫu nhiên tại các vị trí cố định cho mã gồm 15 ký tự. Khi đổi mã, bạn đảo ngược thuật toán để trích xuất khóa và tính ngẫu nhiên, bỏ đi hai ký tự ngẫu nhiên bổ sung, sau đó so sánh ngẫu nhiên với tìm thấy được lưu trữ bằng khóa để xác thực mã.

10

Nếu tôi hiểu chính xác bạn, bạn muốn tạo 63 mã số milion gồm 10 chữ số có "yếu tố dự đoán" thấp.

Có 10.000.000.000 kết hợp hợp lệ. Trong số 63.000.000 là số giá. 63/10.000 = 0,0063. Vì vậy, mỗi lần đoán có 0,63% cơ hội thành công. Không âm thanh cao, nhưng với sức mạnh vũ phu, các con số khá dễ dàng để có được.

Bạn có chắc tỷ lệ 63 trên 10.000 là đủ tốt không?

+2

Đây là một điểm tốt. –

+2

Lý do chính đáng không sử dụng chữ số thập phân; xem kgiannakakis – MSalters

+0

Ông đặc biệt nói các ký tự, chứ không phải chữ số. Một cảnh báo tốt, nhưng tôi nghĩ anh ấy đã nhận được điều đó. – tvanfosson

0

Bạn nói mã có độ dài 10 ký tự, nhưng ký tự của bạn là gì?

Nếu đó chỉ là chữ số, thì (@Gamecat), có thể sẽ hơi quá dễ để đoán ngẫu nhiên mã.

Mặt khác, nếu bộ ký tự là chữ cái + chữ số, thì bạn đã có rất nhiều sự an toàn.

Trong mọi trường hợp, hãy tạo trình tạo số ngẫu nhiên an toàn và kiểm tra các bản sao trước khi đưa vào cơ sở dữ liệu.

4

Hãy cẩn thận khi sử dụng chữ và số cho mã, vì bạn không muốn vô tình tạo ra bất kỳ điều gì gây nhầm lẫn hoặc lúng túng. Để tránh nhầm lẫn, tôi đề nghị xóa 1 và L, 0 và O, và có thể 8 và B. Để tránh bối rối, hãy cân nhắc xóa tất cả nguyên âm để bạn không thể vô tình đánh vần bất cứ điều gì (sử dụng trí tưởng tượng của bạn ở đây).

Các vấn đề liên quan