panda's tech note

Advent Calendar 2019: advfs

Day 12: 重複排除機能(1)

今日からは昨日までに実装した ramfs に重複排除(dedup: deduplication)機能を追加していきます。重複排除は同一内容のブロックが存在する場合,例えば同一内容のファイルが複数存在する場合に,ブロックデバイス上で重複を排除し,容量を節約する手法です。

重複検出

重複排除を実装するにはまず重複を検出する必要があります。重複の検出にはハッシュ関数を使うことにします。

今回はハッシュ関数として SHA-2 SHA-384 を使いますが,SHA 関数を自分で実装するのは大変なので,OpenSSL ライブラリを使います。

OpenSSL を使うには,以下の4つのヘッダをインクルードします。

#include <openssl/crypto.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <openssl/rand.h>

例えば, "abc" という文字列のハッシュ値は以下のようなコードで計算できます。

    unsigned char hash[SHA384_DIGEST_LENGTH];
    unsigned char str[] = "abc";
    SHA384(str, strlen((char *)str), hash);
    for ( i = 0; i < SHA384_DIGEST_LENGTH; i++ ) {
        printf("%02x", hash[i]);
    }
    printf("\n");

この SHA-384 ハッシュ関数を4096バイトのブロックにかけることで重複検出を行います。

SHA-384 のハッシュ値は384ビット,つまり48バイトです。4096バイトのブロックに対してハッシュ値を管理する必要があるので,ハッシュ値だけで約1.17%のオーバーヘッドがあります。

今日のまとめと明日の予定

今日は重複検出のために OpenSSL ライブラリの SHA-384 ハッシュ関数を導入しました。明日はこれを使ってブロック管理と重複排除機能を実装しようと思います。