Genellikle basit bir karma işlevi, girdinin "bileşen parçalarını" (bir dize durumunda karakterler) alıp bunları bir sabitin güçleriyle çarparak ve bunları bir tamsayı türünde bir araya getirerek çalışır. Örneğin, bir dizenin tipik bir (özellikle iyi olmasa da) karması şöyle olabilir:
(first char) + k * (second char) + k^2 * (third char) + ...
Daha sonra, aynı ilk karaktere sahip bir dizi dizge beslenirse, sonuçların tümü, en azından tamsayı tipi taşana kadar aynı modulo k olacaktır.
[Örnek olarak, Java'nın hashCode dizesi buna benzerdir - karakterleri ters sırayla yapar, k = 31 ile. Böylece, aynı şekilde biten dizeler arasında çarpıcı ilişkiler modulo 31 ve sonuna yakın dışında aynı olan dizeler arasında çarpıcı modulo 2 ^ 32 elde edersiniz. Bu, hashtable davranışı ciddiye almaz.]
Bir karma tablo, karma sayısının kova sayısına göre alınmasıyla çalışır.
Çarpışmalar, hashtable'ın verimliliğini azalttığından, olası durumlar için çarpışma üretmemek önemlidir.
Şimdi, birisinin, tüm değerler aynı ilk karaktere sahip olduğu gibi, öğeler arasında bir ilişkisi olan bir hashtable'a bir sürü değer koyduğunu varsayalım. Bu oldukça tahmin edilebilir bir kullanım modeli, diyebilirim, bu yüzden çok fazla çarpışma üretmesini istemiyoruz.
"Matematiğin doğası nedeniyle", eğer karmada kullanılan sabit ve kova sayısının eşzamanlı olduğu ortaya çıkarsa , bazı yaygın durumlarda çarpışmalar en aza indirilir. Eğer onlar bir eştir değilse, çarpışmaların en aza indirilmediği girdiler arasında oldukça basit bazı ilişkiler vardır. Tüm karmalar ortak faktöre eşit modulo çıkar, bu da hepsinin ortak faktörü olan bu modulo değerine sahip kovaların 1 / n'ine düşeceği anlamına gelir. N çarpı çarpma elde edersiniz, burada n ortak faktördür. N en az 2 olduğu için, normalden en az iki kat daha fazla çarpışma oluşturmanın oldukça basit bir kullanım durumu için kabul edilemez olduğunu söyleyebilirim. Bazı kullanıcılar dağıtımımızı bölümlere ayıracaksa, bunun basit bir öngörülebilir kullanım değil, bir ucube kazası olmasını istiyoruz.
Şimdi, hashtable uygulamaların kendilerine konulan öğeler üzerinde hiçbir kontrolü yoktur. İlişkilerini engelleyemezler. Dolayısıyla yapılacak şey, sabit ve kepçe sayımlarının eş zamanlı olmasını sağlamaktır. Bu şekilde, kepçenin bazı küçük ortak faktörlere göre modülünü belirlemek için yalnızca "son" bileşene güvenmezsiniz. Bildiğim kadarıyla bunu başarmak için asal olmak zorunda değiller, sadece coprime.
Ancak, hash işlevi ve hashtable bağımsız olarak yazılırsa, hashtable, hash işlevinin nasıl çalıştığını bilmez. Küçük faktörlere sahip bir sabit kullanıyor olabilir. Şanslıysanız, tamamen farklı çalışabilir ve doğrusal olmayabilir. Karma yeterince iyiyse, herhangi bir kova sayısı gayet iyidir. Ancak paranoyak bir hashtable iyi bir hash fonksiyonu üstlenemez, bu nedenle asal sayıda kova kullanmalıdır. Benzer şekilde, bir paranoyak hash fonksiyonu, birinin sabit ile ortak bir faktöre sahip olan bir dizi kova kullanma şansını azaltmak için büyük bir ana sabit kullanmalıdır.
Uygulamada, kova sayısı olarak 2'lik bir güç kullanmanın oldukça normal olduğunu düşünüyorum. Bu, kullanışlıdır ve doğru büyüklükte asal sayıda arama yapmak veya önceden seçmek zorunda kalmadan kaydeder. Bu nedenle, genellikle güvenli bir varsayım olan çarpanları kullanmamak için karma işlevine güvenirsiniz. Ancak, yukarıdaki gibi karma işlevlere dayalı olarak zaman zaman kötü karma davranışlar elde edebilirsiniz ve asal kova sayısı daha fazla yardımcı olabilir.
"Her şeyin asıl olması gerektiği" ilkesini benimsediğim kadarıyla hashtable'lar üzerinde iyi dağıtım için yeterli ancak gerekli bir koşul değil. Herkesin, diğerlerinin aynı kuralı izlediğini varsaymaya gerek kalmadan birlikte çalışmasına izin verir.
[Düzenle: asal sayıda kova kullanmak için daha özel bir neden daha var, bu da doğrusal problama ile çarpışmaları ele alıyorsanız. Daha sonra hashcode'dan bir adım hesaplarsınız ve bu adım, kova sayımının bir faktörü olarak ortaya çıkarsa, başlangıçtan geri dönmeden önce yalnızca (bucket_count / stride) probları yapabilirsiniz. En çok kaçınmak istediğiniz durum elbette özel kasa olması gereken adım = 0'dır, ancak küçük bir tam sayıya eşit özel kasa kovası / sayımı / adımdan kaçınmak için, sadece bucket_count'u hazırlayabilir ve adım 0 olmadığı sürece sağlanır.]