質問
昨日は品質に関する仕事をしていて、正式なテストを行っていました。彼らの手順では、テスト マシン上のすべてのファイルがリリースから取得されたものであることを確認していました。これらのファイルが同じであることを確認する方法は、Windows エクスプローラーでファイルのサイズと日付/時刻スタンプ ウィンドウをチェックすることでした。これらは別の理由でたまたまオフになっており、その理由を見つけることができました。
これはファイルが同じであることを確認する有効な方法ですか?私はそうは思えず口論を始めましたが、私はここでは年下なので、あまり無理をするべきではないと思いました。ファイルの内容が正確であることを確認するために、ファイルに対してバイナリ比較を行うべきだと主張したかったのです。私の経験では、時刻/日付スタンプとサイズ属性は常に期待どおりに動作するとは限りません。何かご意見は???
解決
2 つのファイルが等しいかどうかを 100% 確認する唯一の方法は、2 つのファイルをバイナリ比較することです。
誤検知のリスクを許容できる場合(つまり、2 つのファイルが 100% 同一ではないが、コードでは完全に同一であると示されている場合)、ダイジェスト アルゴリズムとチェックサム アルゴリズムを使用して作業を軽減できます。特に、ファイルが最適な帯域幅に達していない 2 つの異なるマシン上に存在する場合は、バイナリ比較が可能になります。実現不可能です。
ダイジェスト アルゴリズムとチェックサム アルゴリズムにはすべて誤検知の可能性がありますが、正確な可能性はアルゴリズムによって異なります。一般的なルールとして、暗号化が強化され、出力されるビット数が増えるほど、誤検知の可能性は低くなります。
CRC-32 アルゴリズムもかなり使いやすく、それを実装したコード例をインターネット上で簡単に見つけることができます。
サイズとタイムスタンプの比較のみを行う場合、残念ながらこれは回避するのが簡単で、実際にはファイルが同じであるか異なるかという確信はあまり得られません。
ただし、あなたの世界ではタイムスタンプが保持され、ファイルが変更された場合にのみ変更されることがわかっている場合は、それを使用できるかどうかによりますが、そうでない場合は保証がありません。
他のヒント
ハッシュ化は非常に優れています。しかし、もう 1 つの、少し低技術の代替手段は、WinMerge や TextWrangler などの差分ツールを実行して、各ファイルの 2 つのバージョンを比較することです。退屈だし、人的ミスの余地がある。
何よりも、バージョン管理を使用して、テストしているファイルが編集したファイルであり、これから起動するファイルであることを確認してください。ステージング サイトとライブ サイトとしてリポジトリからのチェックアウト フォルダーがあるため、作業コピーからの変更をコミットすると、テストしてステージングにプッシュし、その後ライブにするファイルが同じであることを 100% 確信できます。各ボックスで「svn update」を実行し、リビジョン番号を確認するだけです。
ああ、急いでロールバックする必要がある場合 (それは誰にでも時々起こります)、-r スイッチを使用して svn update を再度実行するだけで、事実上即座に前のリビジョンに戻ります。
ファイルに対して md5sum ハッシュのようなことを実行し、それをリリースの既知のハッシュと比較します。これらは単なる日付/時刻の比較よりも正確になり、さらに自動化できるはずです。
各ファイルの CRC チェックを行う必要があります...ウィキから:
巡回冗長検査, 、送信またはストレージのエラーを検出するために、チェックサムを生成するために使用されるハッシュ関数の一種。
ファイルの内容に基づいてほぼ一意の値を生成します。