2016-09-08 25 views
8

Tôi đang cố gắng để có được MD5 băm dữ liệu của tôi (hình ảnh tải về từ interweb). Thật không may, tôi đã nâng cấp khung lên để nhanh chóng 3 và phương pháp tôi đã sử dụng hiện không hoạt động.MD5 của dữ liệu trong Swift 3

tôi đã chuyển đổi hầu hết của nó nhưng tôi không thể nhận được byte ra khỏi dữ liệu:

import Foundation 
import CommonCrypto 


struct MD5 { 

    static func get(data: Data) -> String { 
     var digest = [UInt8](repeating: 0, count: Int(CC_MD5_DIGEST_LENGTH)) 
     CC_MD5(data.bytes, CC_LONG(data.count), &digest) 

     var digestHex = "" 
     for index in 0..<Int(CC_MD5_DIGEST_LENGTH) { 
      digestHex += String(format: "%02x", digest[index]) 
     } 

     return digestHex 
    } 

} 

các CommonCrypto đã được nhập khẩu như là một module tùy chỉnh. Vấn đề là tôi đang nhận được 'bytes' is unavailable: use withUnsafeBytes instead trên CC_MD5(data.bytes,...

Vì vậy, câu hỏi thực sự là, làm cách nào để lấy các byte ra khỏi dữ liệu và giải pháp này có hoạt động không?

+0

Đây là [triển khai Swift thuần túy của tôi] (https://github.com/NikolaiRuhe/SwiftDigest) không cần CommonCrypto. –

Trả lời

13
CC_MD5(data.bytes, CC_LONG(data.count), &digest) 

Như đã nêu, bytes không khả dụng vì nó nguy hiểm. Đó là một con trỏ thô vào bộ nhớ hơn là có thể biến mất. Các giải pháp được đề nghị là sử dụng withUnsafeBytes mà hứa hẹn rằng mục tiêu không thể biến mất trong phạm vi của con trỏ. Từ bộ nhớ, nó sẽ giống như thế này:

data.withUnsafeBytes { bytes in 
    CC_MD5(bytes, CC_LONG(data.count), &digest) 
} 

Vấn đề là con trỏ bytes không thể thoát ra phạm vi nơi data không còn giá trị.

Ví dụ về điều này với CCHmac, tương tự như MD5, xem RNCryptor.

+0

Tôi đang tìm kiếm câu trả lời này quá lâu! Cảm ơn bạn – Sn0wfreeze

+0

Một lý do khác khiến Swift là một trong những ngôn ngữ tồi tệ nhất mà tôi từng sử dụng: tại sao không chỉ đơn giản là md5 (blah: AnyObject) -> String: ( –

+0

Cú pháp được gợi ý của bạn cực kỳ mơ hồ và sẽ dẫn đến sự nhầm lẫn đáng kể thường gặp phải với các nhà phát triển, những người cố gắng thực hiện băm trong PHP và JavaScript và nhận được kết quả không mong muốn và không chính xác mà tôi phải hướng dẫn họ thông qua việc sửa). Nhưng có, nếu điều này không được cầu kỳ diệu từ C, và có giao diện Swift đúng, bạn ' sửa lại nó sẽ không bao giờ trông như thế này (bởi vì cú pháp cầu kỳ kỳ diệu này rất xấu xí), nó sẽ là một phương thức đơn giản trên Data và sẽ trả về một dữ liệu có lẽ là Data.md5Hashed() hoặc tương tự. –

Các vấn đề liên quan