chalametpir_common 0.8.0

Common Utilities for ChalametPIR: Private Information Retrieval for Key-Value Databases
Documentation
use std::collections::HashMap;

#[cfg(feature = "wasm")]
use tinyrand::{Rand, RandRange, StdRand};

#[cfg(not(feature = "wasm"))]
use rand::prelude::*;
#[cfg(not(feature = "wasm"))]
use rand_chacha::ChaCha8Rng;

/// Generates a random key-value database with the requested number of key-value pairs.
///
/// # Arguments
///
/// * `num_kv_pairs` - The number of key-value pairs to generate.
///
/// # Returns
///
/// * `HashMap<Vec<u8>, Vec<u8>>` - A HashMap containing the generated key-value pairs.
///   The keys and values are randomly generated byte arrays with lengths between fixed minimum and maximum values.
#[cfg(not(feature = "wasm"))]
pub fn generate_random_kv_database(num_kv_pairs: usize) -> HashMap<Vec<u8>, Vec<u8>> {
    const MIN_KEY_BYTE_LEN: usize = 16;
    const MAX_KEY_BYTE_LEN: usize = 32;
    const MIN_VALUE_BYTE_LEN: usize = 1;
    const MAX_VALUE_BYTE_LEN: usize = 512;

    let mut kv = HashMap::with_capacity(num_kv_pairs);
    let mut rng = ChaCha8Rng::from_os_rng();

    for _ in 0..num_kv_pairs {
        let key_byte_len = rng.random_range(MIN_KEY_BYTE_LEN..=MAX_KEY_BYTE_LEN);
        let value_byte_len = rng.random_range(MIN_VALUE_BYTE_LEN..=MAX_VALUE_BYTE_LEN);

        let mut key = vec![0u8; key_byte_len];
        let mut value = vec![0u8; value_byte_len];

        rng.fill_bytes(&mut key);
        rng.fill_bytes(&mut value);

        kv.insert(key, value);
    }

    kv
}

/// Generates a random key-value database with the requested number of key-value pairs.
///
/// # Arguments
///
/// * `num_kv_pairs` - The number of key-value pairs to generate.
///
/// # Returns
///
/// * `HashMap<Vec<u8>, Vec<u8>>` - A HashMap containing the generated key-value pairs.
///   The keys and values are randomly generated byte arrays with lengths between fixed minimum and maximum values.
#[cfg(feature = "wasm")]
pub fn generate_random_kv_database(num_kv_pairs: usize) -> HashMap<Vec<u8>, Vec<u8>> {
    const MIN_KEY_BYTE_LEN: usize = 16;
    const MAX_KEY_BYTE_LEN: usize = 32;
    const MIN_VALUE_BYTE_LEN: usize = 1;
    const MAX_VALUE_BYTE_LEN: usize = 512;

    let mut kv = HashMap::with_capacity(num_kv_pairs);
    let mut rng = StdRand::default();

    for _ in 0..num_kv_pairs {
        let key_byte_len = rng.next_range(MIN_KEY_BYTE_LEN..(MAX_KEY_BYTE_LEN + 1));
        let value_byte_len = rng.next_range(MIN_VALUE_BYTE_LEN..(MAX_VALUE_BYTE_LEN + 1));

        let key = (0..key_byte_len).map(|_| rng.next_u32() as u8).collect::<Vec<u8>>();
        let value = (0..value_byte_len).map(|_| rng.next_u32() as u8).collect::<Vec<u8>>();

        kv.insert(key, value);
    }

    kv
}