我正在使用以下代码创建哈希值,现在发生的是,当我在Windows本地Xampp服务器上测试哈希值时,我得到的哈希值与在Linux上运行的相同代码不同。
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $newname);
"Stored in: " . "upload/" . $_FILES["file"]["name"];
$image = "upload/" . $newname;
$sign = md5(file_get_contents($image));
现在我不知道为什么会这样。对于我上面粘贴的相同代码。
EDIT:再次打开问题。我发现该解决方案仅适用于Linux,这意味着linux和Windows现在给我相同的哈希值,但是从Mac(IOS)上传图像时,它仍会生成不同的哈希值。
好吧,我找到了我的问题的答案,我仍然不知道为什么在Windows和Linux中为同一代码生成了两个不同的哈希值
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $newname);
"Stored in: " . "upload/" . $_FILES["file"]["name"];
$image = "upload/" . $newname;
$sign = md5(file_get_contents($image));//This is code block that i was implmenting before solution
我在这里尝试的是用以下代码替换了上面的代码
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $newname);
"Stored in: " . "upload/" . $_FILES["file"]["name"];
$image = "upload/" . $newname;
$sign = md5_file($image);// Changed here
[因此,我认为md5()
生成的哈希值可能相同,但是如果此函数接受文件作为输入,则哈希值的计算方式会有所不同,我不知道这是PHP方面的问题还是真正的OS级问题,但是如果我继续使用md5_file()
生成文件的哈希,我没有得到不同的哈希。
Windows和Linux具有不同的行尾,\ r \ n和\ n。因此,在读取文件时,文件的内容是不同的。
尝试上传没有新行或二进制文件的文本文件。还要检查读取字节的差异。它应等于下一个文件中的新行数。
要使用类似于此命令的东西获得与在Mac中产生的散列相同的散列:
shasum -a 256 -p {filename} | cut -d' ' -f1"
将{filename}替换为要在Mac上哈希的文件名。 | cut -d' ' -f1
从返回的末尾截断文件名,因为只对哈希感兴趣。
在Windows上,您需要执行相同的哈希操作:
获取文件流并调用我创建的此函数:
public static string GetSha256Checksum(this Stream stream)
{
stream.Rewind();
using (var sha256 = SHA256Cng.Create())
{
return string.Concat(
sha256.ComputeHash(stream)
.Select(item => item.ToString("x2"))
);
}
}
这是创建与Mac相同的哈希时的根本区别:
string.Concat(sha256.ComputeHash(stream)
.Select(item => item.ToString("x2"))
可能会在fopen()的页面上找到有关如何避免行尾问题的信息,但基本上归结为在读写文件时使用'wb'和'rb'。这是指向fopen page的链接。
这意味着可能无法使用file_get_content(),因为似乎没有设置读取模式的选项。