クライアント(C#)とサーバー(PHP)の両方のファイル構造でファイル/フォルダーをMD5ハッシュする必要があります。(サーバーランドはPHPで、クライアントランドはc#です。)問題は、それらが機能している間、それらが一致しないことです。任意のアイデアをいただければ幸いです
これが私の2つのアルゴリズムです
C#
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace nofolder
{
public class classHasher
{
/**********
* recursive folder MD5 hash of a dir
*/
MD5 hashAlgo = null;
StringBuilder sb;
public classHasher()
{
hashAlgo = new MD5CryptoServiceProvider();
}
public string getHash(String path)
{
// get the file attributes for file or directory
if (File.Exists(path)) return getHashOverFile(path);
if (Directory.Exists(path)) return getHashOverFolder(path);
return "";
}
public string getHashOverFolder(String path)
{
sb = new StringBuilder();
getFolderContents(path);
return sb.ToString().GetHashCode().ToString();
}
public string getHashOverFile(String filename)
{
sb = new StringBuilder();
getFileHash(filename);
return sb.ToString().GetHashCode().ToString();
}
private void getFolderContents(string fold)
{
foreach (var d in Directory.GetDirectories(fold))
{
getFolderContents(d);
}
foreach (var f in Directory.GetFiles(fold))
{
getFileHash(f);
}
}
private void getFileHash(String f)
{
using (FileStream file = new FileStream(f, FileMode.Open, FileAccess.Read))
{
byte[] retVal = hashAlgo.ComputeHash(file);
file.Close();
foreach (var y in retVal)
{
sb.Append(y.ToString());
}
}
}
}
}
PHP
function include__md5_dir($dir){
/**********
* recursive folder MD5 hash of a dir
*/
if (!is_dir($dir)){
return md5_file($dir);
}
$filemd5s = array();
$d = dir($dir);
while (false !== ($entry = $d->read())){
if ($entry != '.' && $entry != '..'){
if (is_dir($dir.'/'.$entry)){
$filemd5s[] = include__md5_dir($dir.'/'.$entry);
}
else{
$filemd5s[] = md5_file($dir.'/'.$entry);
}
}
}
$d->close();
return md5(implode('', $filemd5s));
}
編集。
私はc#を変更する必要があると判断しました。PHPはそのままで問題ありません。100%動作する最初のコードは、恩恵を受けます