Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Тема
Описание
Доп.

crate rand - для генерации случайных данных

The Rust Rand Book

Для чего нужен:

  • Генерация случайных чисел
  • Случайные выборки из коллекций
  • Перемешивание данных (shuffle)
  • Генерация случайных значений разных типов

Типичные случаи использования:

  • Игры (броски кубиков, карты)
  • Тестирование (генерация тестовых данных)
  • Алгоритмы (рандомизированные алгоритмы)
  • Криптография (генерация ключей)

use rand::Rng;

fn main() {
    let mut rng = rand::thread_rng();
    
    // Случайное число в диапазоне
    let num: i32 = rng.gen_range(1..=100);
    
    // Случайное bool значение
    let boolean: bool = rng.gen();
    
    // Перемешивание вектора
    let mut vec = vec![1, 2, 3, 4, 5];
    rng.shuffle(&mut vec);
}

Выбор случайного элемента из массива


use rand::seq::SliceRandom;

fn main() {
    let mut rng = rand::thread_rng();
    let options = ["Alice", "Bob", "Carol"];
    if let Some(choice) = options.choose(&mut rng) {
        println!("Random choice: {}", choice);
    }
}

Перемешивание массива


use rand::seq::SliceRandom;

fn main() {
    let mut rng = rand::thread_rng();
    let mut numbers = [1, 2, 3, 4, 5];
    numbers.shuffle(&mut rng);

    println!("Shuffled array: {:?}", numbers);
}

Генерация случайной строки


use rand::{thread_rng, Rng};
use rand::distributions::Alphanumeric;

fn main() {
    let random_string: String = thread_rng()
        .sample_iter(&Alphanumeric) // Итератор случайных символов
        .take(10) // Длина строки
        .map(char::from)
        .collect();

    println!("Random string: {}", random_string);
}

Использование пользовательских распределений


use rand::distributions::{Distribution, Uniform};

fn main() {
    let between = Uniform::from(10..20); // Равномерное распределение в диапазоне [10, 20)
    let mut rng = rand::thread_rng();

    for _ in 0..5 {
        let number = between.sample(&mut rng);
        println!("Random number: {}", number);
    }
}

crate uuid - для генерации уникальных идентификаторов

Для чего нужен:

  • Создание UUID (Universally Unique Identifier)
  • Уникальные идентификаторы для баз данных
  • Идентификация объектов в распределенных системах
  • Генерация токенов и ключей

Типичные случаи использования:

  • Базы данных (первичные ключи)
  • Веб-API (идентификация запросов)
  • Распределенные системы
  • Файловые системы (уникальные имена файлов)

use uuid::Uuid;

fn main() {
    // Генерация случайного UUID v4
    let id = Uuid::new_v4();
    println!("UUID: {}", id);
    
    // Парсинг UUID из строки
    let parsed = Uuid::parse_str("550e8400-e29b-41d4-a716-446655440000").unwrap();
    
    // Конкретные версии UUID
    let v1 = Uuid::new_v1(); // На основе времени
    let v3 = Uuid::new_v3(); // MD5 хэш
    let v5 = Uuid::new_v5(); // SHA-1 хэш
}

Создание UUID из массива байтов


use uuid::Uuid;

fn main() {
    let bytes = [
        0x55, 0x0e, 0x84, 0x00, 0xe2, 0x9b, 0x41, 0xd4, 
        0xa7, 0x16, 0x44, 0x66, 0x55, 0x44, 0x00, 0x00,
    ];
    let uuid = Uuid::from_bytes(bytes);

    println!("UUID from bytes: {}", uuid);
}

Uuid можно хранить в структурах,

сериализовать/десериализовать через serde,

удобно использовать в API (JSON, TOML, YAML и т.д.).

Файл Cargo.toml:

[dependencies]
uuid = { version = "1", features = ["serde", "v4"] }
serde = { version = "1", features = ["derive"] }
serde_json = "1"

uuid поддерживает сериализацию с использованием serde


use serde::{Serialize, Deserialize};
use uuid::Uuid;

#[derive(Serialize, Deserialize, Debug)]
struct User {
    id: Uuid,
    name: String,
}

fn main() {
    // Генерируем нового пользователя с UUID v4
    let user = User {
        id: Uuid::new_v4(),
        name: "Alice".to_string(),
    };

    // Сериализация в JSON
    let json = serde_json::to_string_pretty(&user).unwrap();
    println!("JSON:\n{}", json);

    // Десериализация обратно в структуру
    let deserialized: User = serde_json::from_str(&json).unwrap();
    println!("Десериализованный: {:?}", deserialized);

    // Пример: создание UUID из строки
    let parsed = Uuid::parse_str("f47ac10b-58cc-4372-a567-0e02b2c3d479").unwrap();
    println!("Парсинг UUID: {}", parsed);
}

Вывод:

JSON:
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "name": "Alice"
}
Десериализованный: User { id: 550e8400-e29b-41d4-a716-446655440000, name: "Alice" }
Парсинг UUID: f47ac10b-58cc-4372-a567-0e02b2c3d479