iT邦幫忙

2024 iThome 鐵人賽

DAY 25
0
Software Development

Rust 學得動嗎系列 第 25

[Day 25] Rust 在產業中的實際應用

  • 分享至 

  • xImage
  •  

今天,我們來聊聊 Rust 在各種產業中的實際應用案例,並提供相關的程式碼範例,我們可以從這些案例了解Rust未來的重要性和可能性。

1. 雲端基礎設施:Dropbox 的案例

Dropbox 使用 Rust 重寫了他們的同步引擎,提高了效能和可靠性。以下是一個簡化的檔案同步程式範例:

use std::fs;
use std::path::Path;
use sha2::{Sha256, Digest};

fn calculate_hash<P: AsRef<Path>>(path: P) -> Result<String, std::io::Error> {
    let mut file = fs::File::open(path)?;
    let mut hasher = Sha256::new();
    std::io::copy(&mut file, &mut hasher)?;
    Ok(format!("{:x}", hasher.finalize()))
}

fn sync_file<P: AsRef<Path>>(source: P, destination: P) -> Result<(), std::io::Error> {
    let source_hash = calculate_hash(&source)?;
    let destination_hash = calculate_hash(&destination).unwrap_or_default();

    if source_hash != destination_hash {
        fs::copy(&source, &destination)?;
        println!("檔案已同步:{:?}", destination.as_ref());
    } else {
        println!("檔案無需同步:{:?}", destination.as_ref());
    }

    Ok(())
}

fn main() -> Result<(), std::io::Error> {
    sync_file("source.txt", "destination.txt")?;
    Ok(())
}

2. 網路安全:Cloudflare 的 QUIC 協議實作

Cloudflare 使用 Rust 實作了 QUIC 協議。以下是一個簡化的 QUIC 伺服器範例:

use quinn::{Endpoint, ServerConfig};
use std::net::SocketAddr;
use tokio;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let cert = rcgen::generate_simple_self_signed(vec!["localhost".into()]).unwrap();
    let key_der = cert.serialize_private_key_der();
    let cert_der = cert.serialize_der().unwrap();

    let mut server_config = ServerConfig::default();
    server_config
        .certificate(quinn::CertificateChain::from_certs(vec![quinn::Certificate::from_der(&cert_der)?]), 
                     quinn::PrivateKey::from_der(&key_der)?)?;

    let addr: SocketAddr = "[::1]:4433".parse()?;
    let (endpoint, mut incoming) = Endpoint::server(server_config, addr)?;
    println!("監聽於 {}", endpoint.local_addr()?);

    while let Some(conn) = incoming.next().await {
        tokio::spawn(async move {
            let connection = conn.await.unwrap();
            println!("新連接:{}", connection.remote_address());
            // 處理連接...
        });
    }

    Ok(())
}

3. 遊戲開發:遊戲《Veloren》

Veloren 是一個開源的多人線上角色扮演遊戲,完全用 Rust 編寫。以下是一個簡化的遊戲實體系統範例:

use specs::prelude::*;

#[derive(Component, Debug)]
#[storage(VecStorage)]
struct Position {
    x: f32,
    y: f32,
}

#[derive(Component, Debug)]
#[storage(VecStorage)]
struct Velocity {
    x: f32,
    y: f32,
}

struct MovementSystem;

impl<'a> System<'a> for MovementSystem {
    type SystemData = (WriteStorage<'a, Position>, ReadStorage<'a, Velocity>);

    fn run(&mut self, (mut pos, vel): Self::SystemData) {
        for (pos, vel) in (&mut pos, &vel).join() {
            pos.x += vel.x;
            pos.y += vel.y;
        }
    }
}

fn main() {
    let mut world = World::new();
    world.register::<Position>();
    world.register::<Velocity>();

    world.create_entity()
        .with(Position { x: 0.0, y: 0.0 })
        .with(Velocity { x: 1.0, y: 0.5 })
        .build();

    let mut dispatcher = DispatcherBuilder::new()
        .with(MovementSystem, "movement", &[])
        .build();

    dispatcher.dispatch(&world);
    world.maintain();
}

4. 區塊鏈:Solana 的案例

Solana 是一個高性能的區塊鏈平台,其核心使用 Rust 編寫。以下是一個簡化的區塊結構範例:

use sha2::{Sha256, Digest};
use chrono::Utc;

#[derive(Debug)]
struct Block {
    timestamp: i64,
    data: String,
    previous_hash: String,
    hash: String,
}

impl Block {
    fn new(data: String, previous_hash: String) -> Self {
        let timestamp = Utc::now().timestamp();
        let mut block = Block {
            timestamp,
            data,
            previous_hash,
            hash: String::new(),
        };
        block.hash = block.calculate_hash();
        block
    }

    fn calculate_hash(&self) -> String {
        let mut hasher = Sha256::new();
        hasher.update(self.timestamp.to_string());
        hasher.update(&self.data);
        hasher.update(&self.previous_hash);
        format!("{:x}", hasher.finalize())
    }
}

fn main() {
    let genesis_block = Block::new("創世區塊".to_string(), "0".to_string());
    println!("創世區塊:{:#?}", genesis_block);

    let second_block = Block::new("交易資料".to_string(), genesis_block.hash);
    println!("第二個區塊:{:#?}", second_block);
}

5. 嵌入式系統:用於物聯網設備的程式

Rust 在嵌入式系統和物聯網領域也有廣泛應用。以下是一個簡單的溫度感測器讀取範例:

#![no_std]
#![no_main]

use cortex_m_rt::entry;
use panic_halt as _;
use stm32f3xx_hal::{pac, prelude::*};

#[entry]
fn main() -> ! {
    let dp = pac::Peripherals::take().unwrap();
    let mut rcc = dp.RCC.constrain();
    let mut gpioe = dp.GPIOE.split(&mut rcc.ahb);

    let mut led = gpioe
        .pe9
        .into_push_pull_output(&mut gpioe.moder, &mut gpioe.otyper);

    loop {
        // 模擬讀取溫度感測器
        let temperature = read_temperature();

        if temperature > 25.0 {
            led.set_high().unwrap();
        } else {
            led.set_low().unwrap();
        }
    }
}

fn read_temperature() -> f32 {
    // 這裡應該是實際讀取溫度感測器的代碼
    // 為了示例,我們返回一個固定值
    23.5
}

結論

Rust 在產業中的應用範圍非常廣泛,從底層系統程式設計到高層應用開發都有其身影。它的安全性和效能特性使其特別適合處理關鍵任務和高效能需求的場景。隨著越來越多的公司使用 Rust改寫或是開發新專案,我們可以期待在各個領域中看到更多Rust職缺,不管你們有沒有入坑,我是入坑了(誤


上一篇
[Day 24] Rust 在作業系統開發中的應用
下一篇
[Day 26] Rust 在區塊鏈和加密貨幣領域的應用
系列文
Rust 學得動嗎30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言