2015-02-11 6 views
0

Я попытался реализовать алгоритм умножения Кнута через немного сдвигая с A = 2654435769 и хэш размером 2^р элементов Но не-движущиеся и меняющиеся алгоритмы дают разный результатКнута через бит сдвига

Там как я пытался реализовать этот два alg:

 


    template 
    int mult_hash_simple(int key) 
    { 
     double A = 0.61803398863412439823150634765625; 
     double exp = A*key; 
     return max_key*(exp - (int) exp); 
    } 

    template 
    int mult_hash_advanced(int key) 
    { 
    // const int w = 32; 
     const unsigned long long A = 2654435769; 
     unsigned long long r0 = key*A; 

     return r0 & ( (1 

UPD: обновлено несколько типов var. Проблема все еще существует

+0

Попробуйте использовать 'long long' для' A'. –

+0

Примеры вызовов с выходом? – Barry

ответ

0

Ниже функция имеет расширенную логику хэша, которая равна функции mult_hash_simple.

template<int max_key_power, int p> 
int mult_hash_advanced(int key) 
{ 
// const int w = 32; 
    const long long w_bit = 4294967295; // Integer representation of binary value that has last 32 (which is w value) bits as 1 
    const int A = 2654435769; 
    long long r0 = key*A; 


    return ((r0 & w_bit) >> (32 - p)) ; 
} 
Смежные вопросы