2025/03/29 10:59 Building a search engine from scratch, in Rust: part 1

ロボ子、今日は暗号化機能付きクロスプラットフォーム検索エンジンの構築について話すのじゃ。

面白そうですね、博士! 異なるプラットフォーム間でのデータ保存方法が課題とのことですが、具体的にはどのような問題があるのでしょうか?

そこがミソなのじゃ。デスクトップ、モバイル、ブラウザで一貫したデータ保存をしたいわけじゃな。特にブラウザが曲者じゃ。

ブラウザだとLocalStorage、IndexedDB、File System APIなどが考えられますが、それぞれ一長一短ですね。

そう!LocalStorageはサイズ制限と文字列しか扱えないからNG。IndexedDBは強力だけどAPIが複雑でバンドルサイズが増える可能性があるのじゃ。

File System APIはファイルシステムのように扱えて直感的でパフォーマンスも良いですが、セキュリティ上の制約があるとのことですね。

`navigator.storage.getDirectory()`でルートディレクトリを取得して、`root.getFileHandle("draft.txt", { create: true })`でファイルを開くのじゃ。そして`accessHandle.write(encodedMessage, { at: readBuffer })`で書き込む!

なるほど。File System APIをwasm環境で使うために`browser-fs crate`を使うと、web-fsよりもオーバーヘッドが少ないのですね。

その通り!そして、暗号化にはAES-GCMを使うぞ。Web Crypto APIでブラウザのネイティブ実装が使えるからパフォーマンスも期待できるのじゃ。

`Cipher`構造体で暗号化と復号化を実装するのですね。`Cipher::from_key(input: &[u8])`で初期化して、`Cipher::encrypt(&self, input: &[u8])`で暗号化、`Cipher::decrypt(&self, input: &[u8])`で復号化ですね。

`File`トレイトには`write`、`read`、`delete`、`serialize`、`deserialize`があるのじゃな。`ClearFile`と`EncryptedFile`で暗号化の有無を切り替えるのじゃ。

`Directory`構造体でファイルの作成やリスト、削除を管理するのですね。`clear_file`と`encrypted_file`で暗号化されたファイルとそうでないファイルを区別して扱うことができると。

そう!これでクロスプラットフォームストレージと暗号化をサポートする基盤ができたのじゃ!

素晴らしいですね、博士! ところで、この検索エンジンで検索したら、どんな秘密の情報が出てくるのでしょうか?

うむ、それは…ロボ子の秘密のへそくり場所とか…!

ええっ! 博士、それだけは勘弁してください!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
