開発プロセス中、ファイルコンテンツが複製されているかどうかを判断することは一般的な要件です。たとえば、ファイルのアップロード、ファイルストレージ、または重複コンテンツの防止を扱う場合、ファイルコンテンツが同じかどうかを効率的に判断できる必要があります。 PHPはこの目標を達成するための多くのツールを提供し、 HASH_UPDATE_STREAM関数は非常に実用的な方法です。特に大きなファイルを扱う場合、ファイルのハッシュ値を効率的に計算し、ファイルが複製されているかどうかをすばやく判断するのに役立ちます。
Hash_update_streamは、PHPに組み込まれたハッシュ機能であり、ストリーム(ファイルストリームなど)をハッシュできます。ファイル全体のハッシュを直接計算する従来の方法とは異なり、 hash_update_streamは徐々にストリームを読み取り、ハッシュ値を更新できます。これにより、大きなファイルがメモリに一度にロードされ、メモリと計算時間が保存されます。
hash_update_stream関数を使用してファイルが複製されているかどうかを判断するには、通常、各ファイルのハッシュ値(md5やsha256など)を計算し、計算されたハッシュ値を保存されたハッシュ値と比較するために行われます。ハッシュ値が同じ場合、ファイルコンテンツは重複していると見なされます。
まず、ファイルを開き、そのコンテンツを段階的に読み取り、 hash_update_streamを使用してファイルのハッシュ値を計算する必要があります。
<?php
// ファイルパス
$filePath = 'path/to/your/file.txt';
// ハッシュアルゴリズムを選択します
$hashAlgo = 'sha256'; // 選択できます md5、sha1 その他のアルゴリズム
// ファイルを開きます
$file = fopen($filePath, 'rb');
// ハッシュリソースを初期化します
$hashContext = hash_init($hashAlgo);
// ファイルを段階的に読んで、ハッシュ値を更新します
while (!feof($file)) {
$chunk = fread($file, 1024); // ファイルブロックを読み取ります,大きなファイルを一度にロードしないでください
hash_update_stream($hashContext, $chunk); // ハッシュ値を更新します
}
// 最終的なハッシュ値を計算します
$hashValue = hash_final($hashContext);
// ファイルを閉じます
fclose($file);
echo "ファイルのハッシュ値はです: $hashValue";
?>
ファイルのハッシュ値を計算した後、データベースまたはストレージシステムで既にファイルハッシュ値と比較して、ファイルが複製されているかどうかを判断できます。
<?php
// すでに保存されたハッシュリストがあるとします
$storedHashes = [
'd2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2', // 保存されたファイルハッシュ値
'a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3a3'
];
// 計算されたハッシュ値が保存されたハッシュ値に存在するかどうかを確認します
if (in_array($hashValue, $storedHashes)) {
echo "ファイルコンテンツの重複!";
} else {
echo "ファイルコンテンツは繰り返されません,アップロードまたは保存する準備ができました!