Câu hỏi làm thế nào để tạo số nguyên duy nhất từ ​​3 số nguyên khác nhau (1 Oracle Long, 1 trường ngày, 1 ngắn)


vấn đề là, số 1 đã ORACLE LONG, thứ hai một ngày (SQL DATE, không có thêm thông tin dấu thời gian), cái cuối cùng là một giá trị ngắn trong khoảng 1000-100'000.
làm thế nào tôi có thể tạo ra loại giá trị băm sẽ là duy nhất cho mỗi kết hợp tối ưu?

chuỗi nối và chuyển đổi thành dài sau:
Tôi không muốn điều này, ví dụ.

Ngày tháng

12 1 -> 121
1 12 -> 121


9
2017-08-31 17:30


gốc




Các câu trả lời:


Khi bạn có một vài giá trị số và cần phải có một giá trị "duy nhất" (có nghĩa là không thể trùng lặp thống kê) duy nhất trong số chúng, bạn thường có thể sử dụng công thức như:

h = (a*P1 + b)*P2 + c

trong đó P1 và P2 là số được chọn tốt (ví dụ: nếu bạn biết 'a' luôn nằm trong khoảng 1-31, bạn có thể sử dụng P1 = 32) hoặc khi bạn không biết gì cụ thể về phạm vi cho phép của a, b, Cách tiếp cận tốt nhất là có P1 và P2 là số nguyên tố lớn (chúng có ít cơ hội nhất để tạo ra các giá trị va chạm). Đối với một giải pháp tối ưu, toán học phức tạp hơn một chút, nhưng sử dụng các số nguyên tố bạn thường có thể có một giải pháp tốt.

Ví dụ: triển khai Java cho .hashCode() cho một mảng (hoặc một String) là một cái gì đó như:

h = 0;
for (int i = 0; i < a.length; ++i)
    h = h * 31 + a[i];

Mặc dù cá nhân, tôi đã chọn một số nguyên tố lớn hơn 31 vì các giá trị bên trong một Chuỗi có thể dễ dàng va chạm, vì một vùng đồng bằng gồm 31 địa điểm có thể khá phổ biến, ví dụ:

"BB".hashCode() == "Aa".hashCode() == 2122

14
2017-09-01 14:10





Của bạn

12 1  --> 121
1 12  --> 121

vấn đề được dễ dàng cố định bằng cách không chèn các số đầu vào của bạn đến độ rộng tối đa được mong đợi cho mỗi trường nhập.

Ví dụ: nếu trường đầu tiên có thể nằm trong khoảng từ 0 đến 10000 và trường thứ hai có thể từ 0 đến 100, ví dụ của bạn sẽ trở thành:

00012 001 --> 00012001
00001 012 --> 00001012

3
2017-08-31 18:53



Hi Chris, không đệm không được khuyến khích, vì dữ liệu đầu vào đến từ một API bên ngoài, mà tôi không có bất kỳ tác động nào, nếu chúng thay đổi nó bằng cách nào đó thì tôi sẽ bị kẹt. do đó, nó phải là một giải pháp chung .. Tốt nhất tôi có thể dự đoán là tạo NOT một số dài, nhưng thay vào đó một STRING được nối bởi "_" hoặc "-". sẽ giải quyết vấn đề Id duy nhất của tôi. - yli