sodiumTest

Libsodium examples, client/server system
git clone https://noulin.net/git/sodiumTest.git
Log | Files | Refs | README

bloom.h (6598B)


      1 /*
      2  *  Copyright (c) 2012-2022, Jyri J. Virkki
      3  *  All rights reserved.
      4  *
      5  *  This file is under BSD license. See LICENSE file.
      6  */
      7 
      8 #ifndef _BLOOM_H
      9 #define _BLOOM_H
     10 
     11 #ifdef __cplusplus
     12 extern "C" {
     13 #endif
     14 
     15 #define BLOOM_VERSION_MAJOR 2
     16 #define BLOOM_VERSION_MINOR 0
     17 
     18 #define NULL_BLOOM_FILTER { 0, 0, 0, 0, 0.0, 0, 0, 0, 0.0, NULL }
     19 
     20 #define ENTRIES_T unsigned int
     21 #define BYTES_T unsigned long int
     22 #define BITS_T unsigned long int
     23 
     24 
     25 /** ***************************************************************************
     26  * Structure to keep track of one bloom filter.  Caller needs to
     27  * allocate this and pass it to the functions below. First call for
     28  * every struct must be to bloom_init().
     29  *
     30  */
     31 struct bloom
     32 {
     33   // These fields are part of the public interface of this structure.
     34   // Client code may read these values if desired. Client code MUST NOT
     35   // modify any of these.
     36   unsigned int entries;
     37   unsigned long int bits;
     38   unsigned long int bytes;
     39   unsigned char hashes;
     40   double error;
     41 
     42   // Fields below are private to the implementation. These may go away or
     43   // change incompatibly at any moment. Client code MUST NOT access or rely
     44   // on these.
     45   unsigned char ready;
     46   unsigned char major;
     47   unsigned char minor;
     48   double bpe;
     49   unsigned char * bf;
     50 };
     51 
     52 
     53 /** ***************************************************************************
     54  * Initialize the bloom filter for use.
     55  *
     56  * The filter is initialized with a bit field and number of hash functions
     57  * according to the computations from the wikipedia entry:
     58  *     http://en.wikipedia.org/wiki/Bloom_filter
     59  *
     60  * Optimal number of bits is:
     61  *     bits = (entries * ln(error)) / ln(2)^2
     62  *
     63  * Optimal number of hash functions is:
     64  *     hashes = bpe * ln(2)
     65  *
     66  * Parameters:
     67  * -----------
     68  *     bloom   - Pointer to an allocated struct bloom (see above).
     69  *     entries - The expected number of entries which will be inserted.
     70  *               Must be at least 1000 (in practice, likely much larger).
     71  *     error   - Probability of collision (as long as entries are not
     72  *               exceeded).
     73  *
     74  * Return:
     75  * -------
     76  *     0 - on success
     77  *     1 - on failure
     78  *
     79  */
     80 int bloom_init2(struct bloom * bloom, unsigned int entries, double error);
     81 
     82 
     83 /**
     84  * DEPRECATED.
     85  * Kept for compatibility with libbloom v.1. To be removed in v3.0.
     86  *
     87  */
     88 int bloom_init(struct bloom * bloom, int entries, double error);
     89 
     90 
     91 /** ***************************************************************************
     92  * Check if the given element is in the bloom filter. Remember this may
     93  * return false positive if a collision occurred.
     94  *
     95  * Parameters:
     96  * -----------
     97  *     bloom  - Pointer to an allocated struct bloom (see above).
     98  *     buffer - Pointer to buffer containing element to check.
     99  *     len    - Size of 'buffer'.
    100  *
    101  * Return:
    102  * -------
    103  *     0 - element is not present
    104  *     1 - element is present (or false positive due to collision)
    105  *    -1 - bloom not initialized
    106  *
    107  */
    108 int bloom_check(struct bloom * bloom, const void * buffer, int len);
    109 
    110 
    111 /** ***************************************************************************
    112  * Add the given element to the bloom filter.
    113  * The return code indicates if the element (or a collision) was already in,
    114  * so for the common check+add use case, no need to call check separately.
    115  *
    116  * Parameters:
    117  * -----------
    118  *     bloom  - Pointer to an allocated struct bloom (see above).
    119  *     buffer - Pointer to buffer containing element to add.
    120  *     len    - Size of 'buffer'.
    121  *
    122  * Return:
    123  * -------
    124  *     0 - element was not present and was added
    125  *     1 - element (or a collision) had already been added previously
    126  *    -1 - bloom not initialized
    127  *
    128  */
    129 int bloom_add(struct bloom * bloom, const void * buffer, int len);
    130 
    131 
    132 /** ***************************************************************************
    133  * Print (to stdout) info about this bloom filter. Debugging aid.
    134  *
    135  */
    136 void bloom_print(struct bloom * bloom);
    137 
    138 
    139 /** ***************************************************************************
    140  * Deallocate internal storage.
    141  *
    142  * Upon return, the bloom struct is no longer usable. You may call bloom_init
    143  * again on the same struct to reinitialize it again.
    144  *
    145  * Parameters:
    146  * -----------
    147  *     bloom  - Pointer to an allocated struct bloom (see above).
    148  *
    149  * Return: none
    150  *
    151  */
    152 void bloom_free(struct bloom * bloom);
    153 
    154 
    155 /** ***************************************************************************
    156  * Erase internal storage.
    157  *
    158  * Erases all elements. Upon return, the bloom struct returns to its initial
    159  * (initialized) state.
    160  *
    161  * Parameters:
    162  * -----------
    163  *     bloom  - Pointer to an allocated struct bloom (see above).
    164  *
    165  * Return:
    166  *     0 - on success
    167  *     1 - on failure
    168  *
    169  */
    170 int bloom_reset(struct bloom * bloom);
    171 
    172 
    173 /** ***************************************************************************
    174  * Save a bloom filter to a file.
    175  *
    176  * Parameters:
    177  * -----------
    178  *     bloom    - Pointer to an allocated struct bloom (see above).
    179  *     filename - Create (or overwrite) bloom data to this file.
    180  *
    181  * Return:
    182  *     0 - on success
    183  *     1 - on failure
    184  *
    185  */
    186 int bloom_save(struct bloom * bloom, char * filename);
    187 
    188 
    189 /** ***************************************************************************
    190  * Load a bloom filter from a file.
    191  *
    192  * This functions loads a file previously saved with bloom_save().
    193  *
    194  * Parameters:
    195  * -----------
    196  *     bloom    - Pointer to an allocated struct bloom (see above).
    197  *     filename - Load bloom filter data from this file.
    198  *
    199  * Return:
    200  *     0   - on success
    201  *     > 0 - on failure
    202  *
    203  */
    204 int bloom_load(struct bloom * bloom, char * filename);
    205 
    206 
    207 /** ***************************************************************************
    208  * Merge two compatible bloom filters.
    209  *
    210  * On success, bloom_dest will contain all elements of bloom_src in addition
    211  * to its own. The bloom_src bloom filter is never modified.
    212  *
    213  * Both bloom_dest and bloom_src must be initialized and both must have
    214  * identical parameters.
    215  *
    216  * Parameters:
    217  * -----------
    218  *     bloom_dest - will contain the merged elements from bloom_src
    219  *     bloom_src  - its elements will be merged into bloom_dest
    220  *
    221  * Return:
    222  * -------
    223  *     0 - on success
    224  *     1 - incompatible bloom filters
    225  *    -1 - bloom not initialized
    226  *
    227  */
    228 int bloom_merge(struct bloom * bloom_dest, struct bloom * bloom_src);
    229 
    230 
    231 /** ***************************************************************************
    232  * Returns version string compiled into library.
    233  *
    234  * Return: version string
    235  *
    236  */
    237 const char * bloom_version();
    238 
    239 #ifdef __cplusplus
    240 }
    241 #endif
    242 
    243 #endif