ニッチなシステム作りに、昼夜時間を費やしがちな、ユゲタです。
今回は、ファイル比較についての話です。
gitを使って、ファイルのバージョン管理を便利に行える時代になりましたが、
1つだけのファイルを比較するためだけにgitを利用するには、少々手間がかかるし、
複数のサーバーで、同一のモジュール(ファイル)を管理している時に、それらが、全部同じファイルかどうかを
確認したい場合に、sumコマンドを使うといいという事を、見つけ、これまで知らなかったことを後悔していました。
sumコマンドを知らない人は、このコマンドは、いわゆるチェックサムをするコマンドだと認識しておいてください。
チェックサムについて
チェックサム(英: checksum)とは、語列の各語の総計を利用した誤り検出符号の一種である。
他の誤り検出符号と比べて信頼性は低いものの、単純計算で99.6%以上の検出率があるうえに算術が簡単であることから、簡易な誤り検出に用いられる。
チェックサム - Wikipedia
そもそもgitのファイル比較でもこのチェックサム方式が使われているので、無意識に使っていう人も多いと思いますが、上記の説明をわかりやすく言うと
文字列をコードに変換してその値をチェックサム値とすることで、文字列の違いを簡単に比較する方法
ということですね。
ボクが技術的に理解しているのは、ABCという文字があったばあいに、文字コードに変換して、
A = 65
B = 66
C = 67
これらの文字コードを合計して、
65+66+67 = 198
そして、別の文字列、例えば、BBCとした場合は、199という合計値になるはずなので、
書かれている文字が違っていると簡易に認識できるという事ですね。
チェックサムの落とし穴
でも、上記の方法だと、「ABC」と「BAC」は、同じ値になってしまうので、今度は、それぞれの文字にアドレスを付与した形で、
アドレス(配置場所)が変われば、文字コード自体も変化するという風にすることで、もう少し精度が高くなります。
でも、wikipediaにも書かれている通り、検挙率99.6%というのは、突き詰めていっても、0.4%は、違いを検出できないという結果はどうしても仕方がないかもしれません。
上記のように、短い文字の比較であれば、まあまあ明確な結果になるんですが、プログラミングコードのような、比較的多くの文字に対しての比較であれば、よほどの事がない限り、なかなか違った文字で同じ値を算出するということは、無いというのもあるので、
100%ではない事に、不安を保つ必要もありません。
単純文字であれば、ABC !== BACというように、if文判定すればいいだけですからね。
使う場面について
そして、実際に、このチェックサムを実行できるのが「sum」コマンドですが、
macやlinuxには、デフォルトで入っているコマンドなので、手軽に使うことができます。
$ sub ファイル名
> チェックサム値 ブロック値
こんな感じで、非常に簡単にチェックサムの値が取得できます。
ブロック値というのは、ファイル容量と比例していると考えるといいでしょう。チェックサムとブロック値の2つの値で、ファイルの誤差を判別するという事ですね。
ちょっと気がついた人もいるかもしれませんが、
ファイルのタイムスタンプは、ここのファイル比較では、関係していません。
それは、別サーバーにデータをFTPでアップロードした時に、全く同じファイルだけど、アップロード時間がタイムスタンプされてしまうので、
そのファイルは違っているかと言ったら、同じなので、タイムスタンプは、比較対象から外すのが一般的なんですね。
BASIC時代の神システム
ボクの世代は、ベーマガ世代と言って、今のようにインターネットが無い時代で、ベーシックマガジンという雑誌を買ってきて、家で一人で書かれている数百行(またはそれ以上)のプログラムを自分で打ち込んで、
それをRUNさせてゲームを遊んでいたんですが、この時に、RUNした瞬間に、エラーが出ることは当たり前でした。
ある時から、雑誌に、プログラムの書かれているそれぞれの行の後ろに、「チェックサム」という値がつくようになっていて、
目で行を確認する時に、プログラムではなく、行毎のチェックサム値を確認することで、間違った入力をしている行を確定させるというやり方をしていました。
今考えると、その作業すら、瞬間でできてしまう機能がたくさんありますが、ファイル比較のチェックサムが、この原理であると認識できることは、非常にその次代でやっていたからこそと実感することができました。
まあ、いまだに、プログラミングをやっている事自体は、当時となんにも変わらないのは、自分的に面白くも有り、本当に成長してんのかオレ?と考えてしまう部分でもあるかもしれないけどね〜。
0 件のコメント:
コメントを投稿