]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
primes_closest(): Use exponentially growing primes.
authorTimo Sirainen <tss@iki.fi>
Mon, 1 Sep 2008 12:04:00 +0000 (15:04 +0300)
committerTimo Sirainen <tss@iki.fi>
Mon, 1 Sep 2008 12:04:00 +0000 (15:04 +0300)
--HG--
branch : HEAD

src/lib/hash.c
src/lib/primes.c
src/tests/test-lib.c

index 08f012f88f28f2d0f7e59aedf5b951cf4319bdf6..a378a7e015d9111839f30f374fc01df8f3ae6679 100644 (file)
@@ -8,7 +8,7 @@
 
 #include <ctype.h>
 
-#define HASH_TABLE_MIN_SIZE 109
+#define HASH_TABLE_MIN_SIZE 131
 
 struct hash_node {
        struct hash_node *next;
index e23fe64a0084c6f34053cc74c57323eaab37650f..5636639c14203205bf4908e485537f629d3d9853 100644 (file)
@@ -2,40 +2,36 @@
 #include "primes.h"
 
 static const unsigned int primes[] = {
-       11,
-       19,
+#define PRIME_SKIP_COUNT 3
+       17,
        37,
-       73,
-       109,
-       163,
-       251,
-       367,
-       557,
-       823,
-       1237,
-       1861,
-       2777,
-       4177,
-       6247,
-       9371,
-       14057,
-       21089,
-       31627,
-       47431,
-       71143,
-       106721,
-       160073,
-       240101,
-       360163,
-       540217,
-       810343,
-       1215497,
-       1823231,
-       2734867,
-       4102283,
-       6153409,
-       9230113,
-       13845163
+       67,
+       131,
+       257, /* next from 2^8 */
+       521,
+       1031,
+       2053,
+       4099,
+       8209,
+       16411,
+       32771,
+       65537, /* next from 2^16 */
+       131101,
+       262147,
+       524309,
+       1048583,
+       2097169,
+       4194319,
+       8388617,
+       16777259, /* next from 2^24 */
+       33554467,
+       67108879,
+       134217757,
+       268435459,
+       536870923,
+       1073741827,
+       2147483659,
+       4294967291 /* previous from 2^32 */
 };
 
 static const unsigned int primes_count = N_ELEMENTS(primes);
@@ -44,9 +40,9 @@ unsigned int primes_closest(unsigned int num)
 {
        unsigned int i;
 
-       for (i = 0; i < primes_count; i++)
-               if (primes[i] >= num)
-                       return primes[i];
-
-       return primes[primes_count - 1];
+       for (i = 31; i > PRIME_SKIP_COUNT; i--) {
+               if ((num & (1 << i)) != 0)
+                       return primes[i - PRIME_SKIP_COUNT];
+       }
+       return primes[0];
 }
index c8257c8c7eb9c8a7407f251185308987fb591e8b..113a72265f76d28c7631cb74b00fb5f72211d7be 100644 (file)
@@ -7,6 +7,7 @@
 #include "bsearch-insert-pos.h"
 #include "aqueue.h"
 #include "network.h"
+#include "primes.h"
 #include "priorityq.h"
 #include "seq-range-array.h"
 #include "str-sanitize.h"
@@ -449,6 +450,26 @@ static int cmp_int(const void *p1, const void *p2)
        return i1->num - i2->num;
 }
 
+static void test_primes(void)
+{
+       unsigned int i, j, num;
+       bool success;
+
+       success = primes_closest(0) > 0;
+       for (num = 1; num < 1024; num++) {
+               if (primes_closest(num) < num)
+                       success = FALSE;
+       }
+       for (i = 10; i < 32; i++) {
+               num = (1 << i) - 100;
+               for (j = 0; j < 200; j++, num++) {
+                       if (primes_closest(num) < num)
+                               success = FALSE;
+               }
+       }
+       test_out("primes_closest()", success);
+}
+
 static void test_priorityq(void)
 {
 #define PQ_MAX_ITEMS 100
@@ -791,6 +812,7 @@ int main(void)
                test_buffer,
                test_mempool_alloconly,
                test_net_is_in_network,
+               test_primes,
                test_priorityq,
                test_seq_range_array,
                test_str_sanitize,