2012-05-22 23 views
30

Bất cứ ai có thể cho tôi biết tại sao số 5381 được sử dụng trong hàm băm DJB?Lý do cho số 5381 trong hàm băm DJB?

DJB Hash chức năng là

h (0) = 5381

h (i) = 33 * h (i-1)^str [i]

Một chương trình c:

unsigned int DJBHash(char* str, unsigned int len) 
{ 
    unsigned int hash = 5381; 
    unsigned int i = 0; 

    for(i = 0; i < len; str++, i++) 
    { 
     hash = ((hash << 5) + hash) + (*str); 
    } 

    return hash; 
} 

Trả lời

23

5381 chỉ là một số trong thử nghiệm, dẫn đến fewer collisionsbetter avalanching. Bạn sẽ tìm thấy "hằng số ma thuật" chỉ bằng mọi thứ băm.

+2

Các URL đã hoán đổi này khiến tôi cười. –

+0

@ Rất tiếc, tôi rất vui khi bạn hài lòng :) Rất may, việc trao đổi URL rất dễ dàng vì tôi chỉ phải chuyển đổi các con số. –

+0

Tôi không thể hiểu được sự hài hước trên. –

13

Tôi đã tìm thấy thuộc tính rất thú vị của số này có thể là lý do cho điều đó.

5381 là nguyên tố 709.
709 là thủ tướng thứ 127.
127 là số nguyên tố thứ 31.
31 là thủ tướng thứ 11.
11 là số nguyên tố thứ 5.
5 là số nguyên tố thứ 3.
3 là thủ tố thứ hai.
2 là số nguyên tố thứ nhất.

5381 là số đầu tiên xảy ra trong 8 lần. 5381st nguyên tố có thể vượt quá giới hạn của int đã ký vì vậy nó là một điểm tốt để ngăn chặn chuỗi.

+0

Bạn thấy điều này như thế nào? –

+1

https://oeis.org/search?q=5381 Nguyên tố 5381st không ở bất kỳ đâu gần với giới hạn của một dấu int. –

+1

@evilotto Trong đoạn mã này, anh ta đã lấy int không dấu và có thể lưu trữ giá trị 52711. –

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