2010-04-03 20 views
6

Tôi đang sử dụng các thuật toán djb2 để tạo phím băm cho một chuỗi đó là như saudjb2 Hash Function

hash(unsigned char *str) 
{ 
    unsigned long hash = 5381; 
    int c; 

    while (c = *str++) 
     hash = ((hash << 5) + hash) + c; /* hash * 33 + c */ 

    return hash; 
} 

Bây giờ với mỗi vòng có một phép nhân với hai con số lớn, Sau một thời gian với 4 của nhân vật thứ 5 của chuỗi có một tràn như giá trị băm trở nên khổng lồ

cách chính xác để cấu trúc lại để các giá trị băm không tràn và băm cũng sẽ xảy ra một cách chính xác

+1

Không có thứ gì như băm DJB2, chỉ có DJB chuẩn, và sau đó là Salsa20 et al. –

+1

http://www.cse.yorku.ca/~oz/hash.html đề cập đến DJB2, tôi tin rằng thuật ngữ được sử dụng rộng rãi, nếu không được công nhận chính thức. – yoyo

Trả lời

17

tính toán hash thường tràn là gì. Nói chung, đó không phải là vấn đề, miễn là bạn có đảm bảo về những gì sẽ xảy ra khi nó làm tràn. Đừng quên rằng điểm của một băm không phải là để có một số có nghĩa là một cái gì đó về magniture vv - nó chỉ là một cách để phát hiện sự bình đẳng. Tại sao tràn sẽ can thiệp vào điều đó?

3

Bạn không nên làm điều đó. Vì không có modulo, tràn số nguyên là hành vi mong đợi cho hàm (và nó được thiết kế với nó). Tại sao bạn muốn thay đổi nó?

4

Tôi đang nghĩ bạn đang sử dụng trình phân tích tĩnh/thời gian chạy để cảnh báo về số nguyên tràn? Đây là một trong những trường hợp bạn có thể bỏ qua cảnh báo. Hàm băm được thiết kế cho các loại thuộc tính cụ thể, do đó, đừng lo lắng về các cảnh báo từ máy phân tích của bạn. Chỉ cần không cố gắng để tạo ra một hàm băm cho mình!

0

trả lại (băm & 0xFFFFFFFF); // hoặc bất kỳ mặt nạ nào bạn muốn, không quan trọng miễn là bạn giữ nó phù hợp.