2011-08-22 49 views
11

Tôi cần chuyên hàm băm cho unordered_map để tôi có thể sử dụng mảng int làm khóa. Giá trị mảng thường là 0 hoặc 1, ví dụ: int array = {0, 1, 0, 1}, nhưng về mặt kỹ thuật không bị chặn.c + + hàm băm cho một mảng int

Ai đó có thể đề xuất chức năng băm tốt trong trường hợp này? Ngoài ra, tôi luôn có thể chuyển đổi mảng int thành chuỗi và tránh chuyên môn hóa. Nhưng tôi lo ngại về hiệu suất vì tôi có thể có vài triệu trong số các mảng này.

+2

Sử dụng hoặc bắt chước "băm phạm vi" của Boost. Nó được xây dựng bằng cách liên tục gọi 'hash_combine', cũng là trong Boost và thực sự nên ở trong tiêu chuẩn. –

+0

Nếu bạn có vài triệu trong số các mảng đó, tôi đề xuất các thuật toán/cấu trúc dữ liệu mới ... – Blindy

+0

@Blindy Bạn đề xuất cấu trúc dữ liệu nào? – gewizz

Trả lời

6

C++ TR1 chứa hàm băm mẫu.

Nếu bạn chưa có, bạn có thể sử dụng Boost Hash.

Ý tưởng cho một helper ích:

#include <boost/functional/hash.hpp> 

template <typename T, int N> 
    static std::size_t hasharray(const T (&arr)[N]) 
{ 
    return boost::hash_range(arr, arr+N); 
} 

Đây sẽ là (? Xấp xỉ) tương đương với

size_t seed = 0; 
for (const T* it=arr; it!=(arr+N); ++it) 
    boost::hash_combine(seed, *it); 
return seed; 

Đừng quên để thực hiện các hoạt động so sánh bình đẳng thích hợp nếu bạn đang sử dụng này băm để tra cứu

+0

Tôi nghĩ rằng nó nên là 'std :: size_t N' vì' std :: size_t' được đảm bảo để có thể đại diện cho kích thước của mảng lớn nhất có thể, trong khi 'int' có thể tràn (tùy thuộc vào hệ thống). Ngoài ra, nó không cần phải là một loại đã ký. – outofthecave

+0

@ outofthecave điểm công bằng. Tuy nhiên, unsigned là truyền nhiễm và làm cho nó khó sử dụng cho offsets (chúng có thể là tiêu cực, và 'N - 10' sẽ chỉ quấn quanh nếu' N <10'. Bất ngờ!). Ngoài ra, mảng được nhập tĩnh ở mức lớn hơn 2³¹ phần tử? Những thứ đó rất hiếm. Và bạn không thường xuyên băm chúng, nếu bạn có chúng. – sehe

5

Thử sử dụng hàm lookup8 hàm băm. Chức năng này rất nhanh và tốt.

int key[100]; 
int key_size=10; 
for (int i=0;i<key_size;i++) key[i]=i; //fill key with sample data 
ub8 hash=hash((ub8*)key, sizeof(key[0])*key_size, 0); 
+0

Đó không phải là C++. – Puppy

+9

Thông thường hàm băm được viết bằng đồng bằng c. Bạn có thể tạo C++ wrapper cho nó. – vromanov

+2

Thông thường, hàm băm được viết * bằng ngôn ngữ *. – Puppy

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