我想计算一个图像的哈希,首先我把图像转换成数据,然后在这个函数的帮助下,我会计算图像文件的哈希(数据),但是生成的哈希不匹配在线生成器和其他语言转换器,像(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?
}
}
好的,这里有一个小测试。为此,我将一个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吗?我会这样: