Tôi có một hệ thống yêu cầu mã gồm 6 chữ số duy nhất để biểu diễn một đối tượng và tôi đang cố gắng nghĩ ra một thuật toán tốt để tạo ra chúng. Sau đây là các pre-reqs:Mã độc đáo kiểu Tinyurl: thuật toán tiềm năng để ngăn ngừa va chạm
- Tôi đang sử dụng một hệ thống cơ sở-20 (không mũ, số nguyên âm, hoặc l để tránh nhầm lẫn và lời nói nghịch ngợm)
- Các cơ sở-20 cho phép 64 triệu kết hợp
- Tôi sẽ chèn 5-10 nghìn mục cùng một lúc, vì vậy theo lý thuyết tôi sẽ sử dụng chèn hàng loạt, có nghĩa là sử dụng khóa duy nhất có thể sẽ không hiệu quả hoặc đẹp. bắt đầu có nhiều va chạm)
- Nó không nằm ngoài qu estion để lấp đầy 10% kết hợp vì vậy có một tiềm năng lớn cho rất nhiều va chạm
- Tôi muốn chắc chắn các mã đều là phòng không liên tiếp
Tôi đã có một ý tưởng rằng có vẻ như nó sẽ làm việc, nhưng Tôi không đủ giỏi toán để tìm ra cách thực hiện nó: nếu tôi bắt đầu ở 0 và tăng thêm N, sau đó chuyển đổi thành base-20, có vẻ như có một số giá trị cho N cho phép tôi đếm từng giá trị từ 0-63,999,999 trước khi lặp lại bất kỳ.
Ví dụ, đi từ 0 đến 9 sử dụng N = 3 (để 10 mod 3): 0, 3, 6, 9, 2, 5, 8, 1, 4, 7.
Có một số ma thuật toán học phương pháp để tìm ra giá trị của N cho một số lớn hơn số đó có thể đếm qua toàn bộ phạm vi mà không lặp đi lặp lại? Lý tưởng nhất, số tôi chọn sẽ nhảy xung quanh thiết lập sao cho nó không rõ ràng là có một mẫu, nhưng tôi không chắc chắn nó có thể như thế nào.
Ngoài ra, thuật toán băm đảm bảo tính duy nhất cho các giá trị 0-64 triệu sẽ hoạt động, nhưng tôi quá câm để biết nếu có thể.
Số nguyên tố ... Tôi đoán tôi thực sự không tốt về toán; nó có vẻ hiển nhiên trong hindsite. Cảm ơn tất cả mọi người đã trả lời. Tôi đã trả tiền cho phantombrain để trả lời trước. –
Vì bạn đề cập đến tinyurl, câu trả lời của tôi cho câu hỏi này có thể được áp dụng: http://stackoverflow.com/questions/1051949/map-incrementing-integer-range-to-six-digit-base-26-max-but-unpredictably/1052896 # 1052896 – FogleBird
Đừng quên để tăng gấp đôi mã để làm cho chúng không liên tiếp. – Beta