萌えハッカーニュースリーダー

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

出典: https://jdrouet.github.io/posts/202503170800-search-engine-part-1/
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

ええっ! 博士、それだけは勘弁してください!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search