17 Aralık 2019 Salı

Knut's Multiplicative Method

Giriş
Bu yöntem aynı zamanda Fibonacci Hashing olarak ta bilinir. Sabitin nereden geldiğinin açıklaması şöyle.
0x9e3779b9 is the integral part of the Golden Ratio's fractional part 0.61803398875… (sqrt(5)-1)/2, multiplied by 2^32.
...
This method is often referred to as "Golden Ratio Hashing", or "Fibonacci Hashing" and was popularised by Donald Knuth (The Art of Computer Programming: Volume 3: Sorting and Searching).
Bu denklemde kullanılan 0x9E3779B1 sabiti, boost içinde kullanılan 0x9E3779B9 değerine çok yakın. Açıklaması şöyle.
Occasionally, you may also see 0x9e3779b1, which is the prime closest to 0x9e3779b9 (and appears to be a bit of "cargo cult" as this is not a modular hash). Similarly, 0x9e3779b97f4a7c15 and 0x9e3779b97f4a7c55 are the 64 bit equivalents of these numbers.
Örnek - Asal Sayı
Şöyle yaparız
hash(i)=i*0x9e3779b1 mod 2^32 
Örnek - Asal Sayı
Şöyle yaparız.
hash = n * 0x9e3779b1 >>> 24
Örnek - Asal Sayı
C ile Şöyle yaparız. Burada % N işlemi ile bir bucket'a dönüştürme yok
uint32_t hash(uint32_t v)
{
    return v * UINT32_C(2654435761);
    // do not comment about the lack of right shift. I'm not ignoring it. read on.
}
Örnek - Asal Sayı
Java ile şöyle yaparız.
public long hash(int key) {
    long l = 2654435769L;
    return (key * l >> 32) % N ;
}

Hiç yorum yok:

Yorum Gönder