对于可变范围的存储桶,有没有人知道散列函数(对于字符串,如果有关系),它总是奇数(或必要时为素数)?
基本上,我正在寻找一个散列函数,它将在n个桶上提供均匀分布,其中n为奇数(或素数,因为n将很小)。
Java .hashCode()
提供统一分布,但仅限于2的幂。
这是some quick test code I whipped up which asserts this。
我在CS Theory StackExchange上交叉发布了这个帖子,因为它似乎介于理论和版本之间。工程。
答案 0 :(得分:1)
以37作为桶长度运行程序,并用
替换散列部分for (String key : keys) {
int hash = key.hashCode();
int index = Math.abs(hash % buckets.length);
buckets[index] = buckets[index] + 1;
}
导致以下结果:
Bucket 0: 4152
Bucket 1: 2593
Bucket 2: 2703
Bucket 3: 2620
Bucket 4: 2742
Bucket 5: 2647
Bucket 6: 2707
Bucket 7: 2673
Bucket 8: 2664
Bucket 9: 2685
Bucket 10: 2734
Bucket 11: 2708
Bucket 12: 2661
Bucket 13: 2678
Bucket 14: 2681
Bucket 15: 2662
Bucket 16: 2682
Bucket 17: 2667
Bucket 18: 2619
Bucket 19: 2572
Bucket 20: 2608
Bucket 21: 2669
Bucket 22: 2670
Bucket 23: 2629
Bucket 24: 2748
Bucket 25: 2651
Bucket 26: 2618
Bucket 27: 2628
Bucket 28: 2740
Bucket 29: 2608
Bucket 30: 2650
Bucket 31: 2645
Bucket 32: 2687
Bucket 33: 2699
Bucket 34: 2627
Bucket 35: 2715
Bucket 36: 2558
Mean: 2702.7027027027025
Standard Deviation: 245.8085241264752
看起来很不错。
您没有测试String.hashCode()
的分布情况。您正在测试分布,如果HashMap的hash()
方法使用密钥的hashCode,并且设计为尝试获得其容量的均匀分布,其必须是2的幂。如果hashCode()
已经返回分布均匀的值,只需使用素数作为除数就可以得到良好的分布。