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

问题描述 投票:9回答:4

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

php ios linux windows hash
4个回答
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

[因此,我认为md5()生成的哈希值可能相同,但是如果此函数接受文件作为输入,则哈希值的计算方式会有所不同,我不知道这是PHP方面的问题还是真正的OS级问题,但是如果我继续使用md5_file()生成文件的哈希,我没有得到不同的哈希。


6
投票

Windows和Linux具有不同的行尾,\ r \ n\ n。因此,在读取文件时,文件的内容是不同的。

尝试上传没有新行或二进制文件的文本文件。还要检查读取字节的差异。它应等于下一个文件中的新行数。


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"))

-1
投票

可能会在fopen()的页面上找到有关如何避免行尾问题的信息,但基本上归结为在读写文件时使用'wb'和'rb'。这是指向fopen page的链接。

这意味着可能无法使用file_get_content(),因为似乎没有设置读取模式的选项。

© www.soinside.com 2019 - 2024. All rights reserved.