在Windows,Linux和Mac上为同一图像创建不同的哈希值

时间:2014-05-23 12:40:33

标签: php ios linux windows hash

我使用以下代码创建哈希值,现在发生的情况是,当我在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)上传图像时,它仍然生成不同的哈希。

4 个答案:

答案 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(),因为似乎没有设置读取模式的选项。