我使用以下代码创建哈希值,现在发生的情况是,当我在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));
现在我不知道为什么会这样。对于我刚刚粘贴的相同代码。
编辑:再次打开问题。我发现的解决方案仅适用于Linux,这意味着Linux和Windows现在给我相同的哈希值,但是当从Mac(IOS)上传图像时,它仍然生成不同的哈希。
答案 0 :(得分:8)
好的,我找到了回答我的问题,我仍然不知道为什么在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
由此我认为Hash值在md5()
生成时可能相同但如果此函数接受文件作为输入,则哈希值的计算方式不同,我不知道这是否是PHP端问题或实际操作系统级问题但如果我继续使用md5_file()
来生成文件的哈希,我就不会得到不同的哈希值。
答案 1 :(得分:6)
Windows和Linux有不同的行结尾, \ r \ n 和 \ n 。因此,当读取文件时,文件的内容是不同的。
尝试上传没有新行或二进制文件的文本文件。还要检查读取的字节差异。它应该等于下一个文件中新行的数量。
答案 2 :(得分:0)
要使用类似于以下命令的内容获得与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"))
答案 3 :(得分:-1)
可以查看fopen()的页面,了解如何避免行结尾问题,但它主要归结为在编写和读取文件时使用'wb'和'rb'。这是fopen page的链接。
意味着可能无法使用file_get_content(),因为似乎没有设置读取模式的选项。