Có bất kỳ thuật toán băm đã biết nào nhập vào một vectơ của int và xuất một int đơn lẻ hoạt động tương tự như một sản phẩm bên trong không?Cách băm một vector số?
Nói cách khác, tôi đang nghĩ về một thuật toán băm mà có thể trông như thế này trong C++:
// For simplicity, I'm not worrying about overflow, and assuming |v| < 7.
int HashVector(const vector<int>& v) {
const int N = kSomethingBig;
const int w[] = {234, 739, 934, 23, 828, 194}; // Carefully chosen constants.
int result = 0;
for (int i = 0; i < v.size(); ++i) result = (result + w[i] * v[i]) % N;
return result;
}
Tôi quan tâm đến điều này bởi vì tôi đang viết lên một bài báo về một thuật toán mà sẽ có lợi từ bất kỳ tác phẩm nào trước đây trên các băm tương tự. Đặc biệt, nó sẽ là tuyệt vời nếu có bất cứ điều gì được biết về các thuộc tính va chạm của một thuật toán băm như thế này.
Thuật toán tôi quan tâm sẽ là vectơ số nguyên băm, nhưng một số thứ cho vectơ nổi cũng sẽ rất tuyệt.
Làm rõ
Các băm được thiết kế để sử dụng trong một bảng băm để tra cứu key/value nhanh. Không có mối quan tâm an ninh ở đây.
Câu trả lời mong muốn giống như một tập hợp các hằng số hoạt động đặc biệt tốt cho một băm như thế này - tương tự như một số nhân và modulo, hoạt động tốt hơn các số khác như một trình tạo số giả ngẫu nhiên.
Ví dụ, một số lựa chọn hằng số cho bộ tạo giả ngẫu nhiên tuyến tính được biết là cung cấp độ dài chu kỳ tối ưu và có modulo dễ tính toán. Có thể ai đó đã thực hiện nghiên cứu để chỉ ra rằng một tập hợp các hằng số nhân, cùng với một hằng số modulo, trong một băm vectơ có thể làm giảm nguy cơ va chạm giữa các vectơ số nguyên lân cận.
Bạn biết gì hoặc giả định về việc phân phối các giá trị đầu vào? Ví dụ của bạn trông giống như tất cả chúng nhỏ hơn 1000. –
Vì mục tiêu là tìm tài liệu tham khảo cho một bài báo, bất kỳ giả định nào họ tạo ra có lẽ là ok. Nhân tiện, hằng số được tạo trong ví dụ không có nghĩa là đầu vào, mà đúng hơn là hằng số trong thuật toán. Tôi đã không chỉ định bất kỳ giá trị đầu vào thực tế nào trong ví dụ đó. – Tyler
Bạn đã cân nhắc sử dụng một hoặc nhiều hàm băm mục đích chung sau: http://www.partow.net/programming/hashfunctions/index.html chúng cực kỳ nhanh và hiệu quả. –