我正在为大型视频文件创建MD5校验和.我目前正在使用代码:
extension NSData {
func MD5() -> Nsstring {
    let digestLength = Int(CC_MD5_DIGEST_LENGTH)
    let md5Buffer = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: digestLength)

    CC_MD5(bytes,CC_LONG(length),md5Buffer)
    let output = NSMutableString(capacity: Int(CC_MD5_DIGEST_LENGTH * 2))
    for i in 0..<digestLength {
        output.appendFormat("%02x",md5Buffer[i])
    }

    return Nsstring(format: output)
    }
}

但这会产生一个内存缓冲区,对于大型视频文件来说并不理想.在Swift中有没有办法计算读取文件流的MD5校验和,因此内存占用量最小?

解决方法

如图所示,您可以按块计算MD5校验和
例如在 Is there a MD5 library that doesn’t require the whole input at the same time?.

以下是使用Swift的可能实现:

func md5File(url: URL) -> Data? {

    let bufferSize = 1024 * 1024

    do {
        // Open file for reading:
        let file = try FileHandle(forReadingFrom: url)
        defer {
            file.closeFile()
        }

        // Create and initialize MD5 context:
        var context = CC_MD5_CTX()
        CC_MD5_Init(&context)

        // Read up to `bufferSize` bytes,until EOF is reached,and update MD5 context:
        while autoreleasepool(invoking: {
            let data = file.readData(ofLength: bufferSize)
            if data.count > 0 {
                data.withUnsafeBytes {
                    _ = CC_MD5_Update(&context,$0,numericCast(data.count))
                }
                return true // Continue
            } else {
                return false // End of file
            }
        }) { }

        // Compute the MD5 digest:
        var digest = Data(count: Int(CC_MD5_DIGEST_LENGTH))
        digest.withUnsafeMutableBytes {
            _ = CC_MD5_Final($0,&context)
        }

        return digest

    } catch {
        print("Cannot open file:",error.localizedDescription)
        return nil
    }
}

需要自动释放池来释放返回的内存
file.readData(),没有它的整个(可能是巨大的)文件
将被加载到内存中.感谢Abhi Beckert注意到这一点
并提供实施.

如果您需要将摘要作为十六进制编码的字符串,请更改
将类型返回到String?并替换

return digest

通过

let hexDigest = digest.map { String(format: "%02hhx",$0) }.joined()
return hexDigest

ios – Swift计算大文件的MD5校验和的更多相关文章

  1. ios – Swift计算大文件的MD5校验和

    我正在为大型视频文件创建MD5校验和.我目前正在使用代码:但这会产生一个内存缓冲区,对于大型视频文件来说并不理想.在Swift中有没有办法计算读取文件流的MD5校验和,因此内存占用量最小?.以下是使用Swift的可能实现:需要自动释放池来释放返回的内存file.readData(),没有它的整个文件将被加载到内存中.感谢AbhiBeckert注意到这一点并提供实施.如果您需要将摘要作为十六进制编码的字符串,请更改将类型返回到String?

  2. android / java中的校验和计算

    我在android/java中写了一个校验和计算函数.功能如下计算校验和的输入值为0xEF,0x01,0xEF,0x33,0x0C,0xB8,0xE5,0xFC,0x34,0xFF,0xFF.我手动计算校验和值,结果为0xCE4.当使用上面的函数时,我的答案为0xFFFFFFE4.在我的计算中是否有任何错误,如果是,那么请纠正我.谢谢解决方法字节根据JavaDocs:Thevalueofabyte

  3. TypeScript与JavaScript项目里引入MD5校验和

    这篇文章主要介绍了TypeScript与JavaScript项目里引入MD5校验和,MD5校验和可以用于验证网络文件传输的完整性以及防止文件被人篡改。下文我们就一起来学习TypeScript与JavaScript项目里引入MD5校验和_MD5校验,需要的朋友可以参考一下

  4. 如何针对DLL劫持来检测我的.NET应用程序?

    我们有一个带注册扩展的.NET3.5应用程序.我们如何保护它免受DLL劫持攻击?

  5. 可以在没有源代码的情况下分发PHP7 opcached文件吗?

    PHP7提供了一个名为opcache的字节码缓存机制.我想知道是否有任何方法可以在不分发源代码的情况下分发和运行PHP脚本的“opcached”版本.我假设在执行脚本时,PHP7将检查opcache目录中是否有匹配名称,时间戳的.bin文件,甚至可能比较校验和或哈希值.如果所有内容都匹配,PHP7将执行.bin文件而不是解析.PHP文件.即使相应的.PHP脚本不存在,也许有可能“欺骗”PHP执行.bin文件?PHP需要能够打开文件以便调用opcache;如果它不存在,则无法加载…

  6. 有没有找到Windows DLL的MD5或其他校验和的地方?

    我有一个Fims系统告诉我DLL/EXE已经改变.如果这些是WindowsDLL并且我们刚刚进行了Windows更新,我可以假设它们没有损坏,但我怎么知道呢?是否有一个位置,我可以获得给定的WindowsDLL/EXE的正确校验和?

  7. ntfs – Windows是否有像ZFS或BtrFS这样的校验和文件系统?

    我使用ZFS并喜欢它.我知道BtrFS也支持校验和.我被告知在Windows2008中可以使用校验和,但我无法验证这一点.除了ZFS和BtrFS在任何平台上都有校验和文件系统,尤其是Windows吗?

  8. ubuntu 更新时出现校验和不符 的一种解决办法

    所以我找到设置源的地方:将其他软件中的两个独立的源勾去掉。然后更新就好了!这样做的原因不明,但这样做确实可以让sudoapt-getupdate不报错。

  9. 【Ubuntu】更新系统时出现Hash校验和不符的错误已解决

    更新系统时出现Hash校验和不符的错误(已解决)在使用sudoapt-getupdate&&sudoapt-getupgrade命令更新系统时出现类似这样的错误信息:出现这样的问题,可能有两种原因:一个是之前的更新没有顺利结束,有临时文件残留;另一个就是网络的问题。P.S.最好,将第一步的清除临时文件的命令再执行一遍。

  10. AngularJS最佳实践 – 模板与Javascript

    默认情况下,Angular在用户导航到路径时从服务器获取HTML模板.考虑到这一点,想象一下这种情况:>用户加载Angular应用程序.主视图有一个名为“Order”的子页面.>当用户正在研究主视图时,新版本的应用程序将在生产中推出.新版本使用新的Javscript和HTML完全重写了Order页面.>用户导航到“订单”页面.浏览器已在步骤1中加载Javascript,因此用户处于旧版本,直到重新加载应用程序.但是新模板在导航时从服务器获取.所以现在Javascript和模板是我们的同步!

随机推荐

  1. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. iOS – genstrings:无法连接到输出目录en.lproj

    使用我桌面上的项目文件夹,我启动终端输入:cd然后将我的项目文件夹拖到终端,它给了我路径.然后我将这行代码粘贴到终端中找.-name*.m|xargsgenstrings-oen.lproj我在终端中收到此错误消息:genstrings:无法连接到输出目录en.lproj它多次打印这行,然后说我的项目是一个目录的路径?没有.strings文件.对我做错了什么的想法?

  3. iOS 7 UIButtonBarItem图像没有色调

    如何确保按钮图标采用全局色调?解决方法只是想将其转换为根注释,以便为“回答”复选标记提供更好的上下文,并提供更好的格式.我能想出这个!

  4. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

  7. 将iOS应用移植到Android

    我们制作了一个具有2000个目标c类的退出大型iOS应用程序.我想知道有一个最佳实践指南将其移植到Android?此外,由于我们的应用程序大量使用UINavigation和UIView控制器,我想知道在Android上有类似的模型和实现.谢谢到目前为止,guenter解决方法老实说,我认为你正在计划的只是制作难以维护的糟糕代码.我意识到这听起来像很多工作,但从长远来看它会更容易,我只是将应用程序的概念“移植”到android并从头开始编写.

  8. ios – 在Swift中覆盖Objective C类方法

    我是Swift的初学者,我正在尝试在Swift项目中使用JSONModel.我想从JSONModel覆盖方法keyMapper,但我没有找到如何覆盖模型类中的Objective-C类方法.该方法的签名是:我怎样才能做到这一点?解决方法您可以像覆盖实例方法一样执行此操作,但使用class关键字除外:

  9. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  10. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

返回
顶部