当前位置: 首页 > 知识库问答 >
问题:

Swift:计算出的图像文件md5哈希与终端和其他哈希生成器不匹配

潘修为
2023-03-14

我想计算一个图像的哈希,首先我把图像转换成数据,然后在这个函数的帮助下,我会计算图像文件的哈希(数据),但是生成的哈希不匹配在线生成器和其他语言转换器,像(Java),甚至我尝试了其他库,但我得到相同的结果,我想当我转换成数据的时候,我的文件发生了一些事情,所以哈希不匹配其他转换器。

但当我计算一个纯文本散列时,它与所有在线转换器和其他语言转换器匹配,但与图像不一样?

谢谢你的帮助

   func md5(url: URL) {
          let bufferSize = 1024*1024
          do {
            let file = try FileHandle.init(forReadingFrom: url)
              defer {
                  file.closeFile()
              }

              var context = CC_MD5_CTX.init()
              CC_MD5_Init(&context)
              while case let data = file.readData(ofLength: bufferSize), data.count > 0 {
                  data.withUnsafeBytes { (poiner) -> Void in
                      _ = CC_MD5_Update(&context, poiner, CC_LONG(data.count))
                  }
              }

                           // Calculate the MD5 summary
              var digest = Data(count: Int(CC_MD5_DIGEST_LENGTH))
              digest.withUnsafeMutableBytes { (pointer) -> Void in
                  _ = CC_MD5_Final(pointer, &context)
              }
              let result = digest.map { (byte) -> String in
                  String.init(format: "%02hhx", byte)
              }.joined()
              print("result: \(result)")
          } catch let error as Error {
              print("calculation error: \(error.localizedDescription)") // Where is the try, where is the error?
          }
      }

共有1个答案

洪子晋
2023-03-14

好的,这里有一个小测试。为此,我将一个png和一些随机文件拖到项目中。它们在下图中突出显示。

请注意,我将文件直接添加到项目中,而不是资产中。我在评论中链接到的答案实际上提到了您不能直接获取图像,但是,正如您所指出的,它也被保存为png数据。

该项目是一个标准的iOS SwiftUI应用html" target="_blank">程序,我将下面的代码添加到自动生成的contentview.swift文件中。

import SwiftUI
import CommonCrypto

struct ContentView: View
{
    var body: some View
    {
        Text("Hello, world!")
            .padding()
            .onAppear
            {
                md5 ( url : Bundle.main.url(forResource: "t", withExtension: "png" ) )
                md5 ( url : Bundle.main.url(forResource: "something", withExtension: "ext" ) )
            }
    }
}

func md5 ( url : URL? ) -> Void
{
    if url == nil
    {
        print ( "Skipping empty url" )
        return
    }
    else
    {
        print ( "Summing \( url )" )
    }

    let bufferSize = 1024*1024
    do {
        let file = try FileHandle.init(forReadingFrom: url!)
        defer {
            file.closeFile()
        }
        
        var context = CC_MD5_CTX.init()
        CC_MD5_Init(&context)
        while case let data = file.readData(ofLength: bufferSize), data.count > 0 {
            data.withUnsafeBytes { (poiner) -> Void in
                _ = CC_MD5_Update(&context, poiner, CC_LONG(data.count))
            }
        }
        
        // Calculate the MD5 summary
        var digest = Data(count: Int(CC_MD5_DIGEST_LENGTH))
        digest.withUnsafeMutableBytes { (pointer) -> Void in
            _ = CC_MD5_Final(pointer, &context)
        }
        let result = digest.map { (byte) -> String in
            String.init(format: "%02hhx", byte)
        }.joined()
        print("result: \(result)")
    } catch let error as Error {
        print("calculation error: \(error.localizedDescription)") // Where is the try, where is the error?
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

这段代码基本上是MD5函数,还有一些代码用来测试添加到项目中的文件。

现在,文件的MD5工作,但它不工作的图像!

我想苹果公司应该在图片上添加了一些东西。我打印了URL并选中了--图像比原始图像小很多,所以它可能是一些删除了所有或大部分元数据的精简版本,但这只是一种猜测。

总之,我和你一样痛苦...为什么这些图像不同-[img drawinrect:]这里的问题苹果改变了你绘制的图像,看起来是任意的。我认为这些调整是为了改进UI或UX,但我个人并不欣赏它们。

您的md5函数通过FWIW工作。但是您应该小心地测试与其他MD5函数相同的文件。因此,您不应该以任何方式对其进行转换,即使只是改变原始数据的一个字节。这就是为什么pngdata是个坏主意的原因。但同时,我希望如果您将它复制到您的项目中,它将保持不变,但显然不是这样。

编辑

如果您将图像重命名为没有扩展名png的内容,然后将其添加到项目中,那么它将保持不变。我复制并将该映像重命名为z.z,并将其添加到项目中,然后MD5(和z.z)与原始映像相同。

 类似资料:
  • 问题内容: 我对加密/哈希知之甚少。 我必须对加密密钥进行哈希处理。Java中的示例是这样的… 现在,如果我错了,请纠正我,但是上面的代码使用MD5算法对字符串进行了哈希处理。 当我在C#中哈希相同的字符串时,我希望得到相同的结果。 我当前的C#代码看起来像这样… 但是末字节结果不匹配。 Java得到… C#得到… 我需要C#代码才能获得与Java代码相同的结果(不是相反),有什么想法吗? 谢谢。

  • 问题内容: 是否有任何方法可以在Java中生成字符串的MD5哈希? 问题答案: 你需要。 调用以获取你可以使用的MD5实例。 通过执行以下操作之一来计算哈希: 将整个输入作为并使用进行一次运算来计算哈希。 订阅通过调用一次块。添加完输入字节后,请使用计算哈希值 。 在返回的是MD5哈希值。

  • 问题内容: 如何编写此代码?我已经拥有了,我需要通过单击按钮将相应的md5哈希发送到服务器。 问题答案: 您可以使用crypto-js。 我也建议使用SHA256,而不是MD5。 要通过NPM安装crypto-js: 或者,您可以使用CDN并引用JS文件。 然后,要显示MD5和SHA256哈希,可以执行以下操作: 此处的工作示例JSFiddle 还有其他一些JS函数会生成哈希,如下所述。 http

  • 好吧,这里都是我的问题。我正在尝试用MD5哈希加密字符串。下面是我试图哈希的字符串: 以下是预期输出: 下面是我在Android应用程序中得到的信息: 下面是我正在使用的代码: 在Android上运行这段代码时,我得到了上述意想不到的结果,但当我运行这段代码时,就像一个Java程序传递相同的字符串一样,我得到了预期的输出... 究竟是怎么回事?几天来,我一直被这件事难住,在网上搜寻线索。我已经尝试

  • 问题内容: 我想计算的不是字符串,而是整个数据结构的md5哈希。我了解执行此操作的方法的机制(调度值的类型,规范化字典键顺序和其他随机性,递归为子值等)。但这似乎是一种通常有用的操作,所以令我惊讶的是我需要自己动手操作。 Python中有一些更简单的方法来实现这一目标吗? 更新:建议使用酸洗,这是一个好主意,但是酸洗不能规范化字典的键顺序: 问题答案: bencode对字典进行排序,因此: 印刷品

  • 问题内容: 我不知道如何实现从php到java的这几行。 好吧,我尝试将其转换,但是得到了不同的结果! java中的结果不同于php中的结果。 你能帮我吗??先感谢您 :) 问题答案: 您不能在不将其转换为字符串的情况下直接使用seq20吗?我会这样: