こんなところで GMP が役立つとは

一昨日ちょこっと書いた重複ファイル検索ツールは、各ファイルのパスとハッシュ(SHA-1)を記憶しておいて、qsort & bsearch で検索、
ってなカンジの適当実装だったんだけど、1500 くらいのファイルがあるディレクトリを検索するのに15秒くらいかかったんだよね。
もっと早くするために qsort & bsearch で使う比較関数をどうにかしようとした。
SHA1_Final で返ってくるハッシュ値は unsigned char sha1[20] なカンジに格納されているから、
最初はそれを sha1[0] から sha1[19] まで順に比較していく、という何の工夫もない比較関数を書いていた。
さすがにこれじゃ遅くなるよなー、と思いつつ、どうしようかと考えているうちに、そういえば GMP なんてライブラリがあったなー、と思い出したわけです。


SHA1_Final で得た配列を GMP多倍長整数に変換して記憶し、qsort & bsearch ではそれを直接比較するように書き直したら、
約3倍早くなって、5秒くらいで検索が終わるようになりました。これくらいならまぁいいかな。
配列を多倍長整数に変換する方法が心配だったけど、mpz_import というそのまんまな API が用意されていた。嬉しいね!


SHA-1 は OpenSSL の libcrypto で求め、それの保持&比較は GMP 任せ、その上ソートと検索は標準ライブラリをそのまんま使うという、
これでもか!というほどの日曜プログラマっぽいツールだけど、目的は果たせたから個人的には満足。