Chức năng phân tán đầu vào


14

Tôi muốn biết nếu có một hàm từ số n bit đến số n bit có các đặc điểm sau:f

  • f nên là tính từ
  • Cả và nên có thể tính toán khá nhanhff1
  • f sẽ trả về một số không có mối tương quan đáng kể với đầu vào của nó.

Lý do là đây:

Tôi muốn viết một chương trình hoạt động trên dữ liệu. Một số thông tin của dữ liệu được lưu trữ trong cây tìm kiếm nhị phân trong đó khóa tìm kiếm là biểu tượng của bảng chữ cái. Với thời gian, tôi thêm các biểu tượng cho bảng chữ cái. Biểu tượng mới chỉ đơn giản là có được số miễn phí tiếp theo có sẵn. Do đó, cây sẽ luôn có độ lệch nhỏ so với các phím nhỏ hơn, điều này gây ra sự cân bằng lại nhiều hơn tôi nghĩ là cần thiết.

Ý tưởng của tôi là kết hợp các số ký hiệu với f sao cho chúng được trải rộng trên toàn bộ phạm vi [0,2641] . Vì số ký hiệu chỉ quan trọng trong đầu vào và đầu ra chỉ xảy ra một lần, nên việc áp dụng một hàm như vậy không quá tốn kém.

Tôi đã nghĩ về một lần lặp của trình tạo số ngẫu nhiên Xorshift, nhưng tôi thực sự không biết cách nào để hoàn tác nó, mặc dù về mặt lý thuyết là có thể.

Có ai biết một chức năng như vậy?
Đây có phải là một ý tưởng tốt?


1
Tôi không phải là chuyên gia, nhưng có lẽ bạn có thể sử dụng hoán vị giả danh (ví dụ: mật mã Feistel )
Vor

Nếu bạn chủ yếu tính toán một hàm băm, tại sao không sử dụng băm?
vonbrand

@vonbrand Băm không thể đảo ngược. Xem số yêu cầu 2.
FUZxxl

Tại sao nó phải được đảo ngược? Điều gì là sai với làm cho nó đảo ngược bằng cách tra cứu?
vonbrand

1
Bạn có thể lưu trữ (f (x), x) làm khóa.
adrianN

Câu trả lời:


6

Bạn có thể sử dụng băm Fibonacci , cụ thể là

.hF(k)=k512k512

Với bạn nhận được n số khác nhau (khoảng) trải đều trong [ 0 , 1 ] . Bằng cách chia tỷ lệ thành [ 1 .. M ] và làm tròn (xuống), bạn sẽ có được các số trải đều trong khoảng đó.k=1,,nn[0,1][1..M]

Ví dụ, đây là những quy mô để [ 0..10000 ] (chuỗi gốc trái, phải sắp xếp):hF(1),,hF(200)[0..10000]

nhập mô tả hình ảnh ở đây

Đây là một ví dụ của những gì Knuth gọi là băm nhân . Đối với kích thước chữ của máy tính, Một số nguyên tố cùng nhau với wM số lượng địa chỉ cần thiết, chúng tôi sử dụngwAwM

h(k)=M((kAw)mod1)

như hàm băm. Trên đây sau với (đảm bảo bạn có thể tính toán với độ chính xác đủ). Trong khi điều này cũng làm việc với bất kỳ số lượng hợp lý khác ngoàiφ-1, nó là một trong những chỉ có hai số mà dẫn đến những con số "phân bố đều nhất".A/w=ϕ1=512ϕ1

Tìm hiểu thêm trong Nghệ thuật lập trình máy tính , Tập 3 của Donald Knuth (chương 6.4 từ trang 513 trong phiên bản thứ hai). Cụ thể, bạn sẽ tìm thấy lý do tại sao các số kết quả khác nhau theo cặp (ít nhất là nếu ) và cách tính hàm nghịch đảo nếu bạn sử dụng Aw tự nhiên thay vì ϕ - 1 .nMAwϕ1


1
Làm thế nào để tính hiệu quả? f1
frafl

1
@frafl Tôi hy vọng chỉnh sửa của tôi giải quyết mối quan tâm của bạn phần nào. Tuy nhiên, rõ ràng là các kỹ thuật băm này cũng không được thiết kế đặc biệt để có thể đảo ngược hiệu quả.
Raphael

Có, tôi sẽ nâng cấp nó, tuy nhiên tôi sẽ không đề xuất nó như là câu trả lời được chấp nhận.
frafl

1

k

hash(n)=(nmod2k2)2k2+ndiv2k2

hash(hash(n))=n{n,m},n<mhash(m)<hash(n){1,,2k21}

Tham chiếu: Hàm băm đảo ngược


Điều này có vẻ đơn giản và tốt đẹp. Tôi sẽ kiểm tra cái đó.
FUZxxl

1
1ρ

nó khá rõ ràng! đối với 64 bit (0x00000000FFFFFFFF) và bạn nên thay đổi (<<) 32 bit. Chức năng này là đơn giản, thực tế và đủ nhanh trong thực tế.
Reza

1
x{1,,2321}232x
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.