首先我們需要一個(gè)橋接文件
- 首先創(chuàng)建一個(gè)OC文件,任意名字都可以
- 創(chuàng)建完會(huì)詢(xún)問(wèn)我們是否需要建立一個(gè)
bridging-header
文件,我們選擇是芍锦,此時(shí)就生成一個(gè)swift-objective-c的橋接文件 - 移除剛才創(chuàng)建的OC文件(.h和.m)
- 在
bridging-header
文件中導(dǎo)入我們需要的頭文件
// MD5 所需文件
#import <CommonCrypto/CommonDigest.h>
在你的拓展類(lèi)中加入拓展方法
// MARK: MD5
extension String {
func md5() -> String {
let str = self.cString(using: String.Encoding.utf8)
let strLen = CUnsignedInt(self.lengthOfBytes(using: String.Encoding.utf8))
let digestLen = Int(CC_MD5_DIGEST_LENGTH)
let result = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: digestLen)
CC_MD5(str!, strLen, result)
let hash = NSMutableString()
for i in 0 ..< digestLen {
hash.appendFormat("%02x", result[i])
}
result.deinitialize()
return String(format: hash as String)
}
}
外部調(diào)用MD5加密算法
var str = "test"
let str_MD5 = str.md5()
MD5的理解苹粟,網(wǎng)上找的復(fù)制過(guò)來(lái)
其中%02x是格式控制符:‘x’表示以16進(jìn)制輸出,‘02’表示不足兩位逆害,前面補(bǔ)0;如‘f’輸出為0f蚣驼,‘1f3’則輸出1f3;本來(lái)一般的都會(huì)介紹到這里就完了魄幕,我想多介紹一下代碼中result是個(gè)字符數(shù)組,那為什么是[16]呢颖杏,這是因?yàn)镸D5算法最后生成的是128位纯陨,而在計(jì)算機(jī)的最小存儲(chǔ)單位為字節(jié),1個(gè)字節(jié)是8位留储,對(duì)應(yīng)一個(gè)char類(lèi)型翼抠,計(jì)算可得需要16個(gè)char。所以result是[16]获讳。那么為什么輸出的格式一定是%02x呢阴颖,而不是其它呢。這也是有原因的:因?yàn)榧s定MD5一般是以16進(jìn)制的格式輸出丐膝,那么其實(shí)這個(gè)問(wèn)題就轉(zhuǎn)換為把128個(gè)0和1以16進(jìn)制來(lái)表示量愧,每4位二進(jìn)制對(duì)應(yīng)一個(gè)16進(jìn)制的元素钾菊,則需要32個(gè)16進(jìn)制的元素,如果元素全部為0侠畔,放到char的數(shù)組中结缚,正常是不會(huì)輸出,如00001111软棺,以%x輸出红竭,則是f,那么就會(huì)丟失0;但如果以%02x表示則輸出結(jié)果是0f喘落,正好是轉(zhuǎn)換的正確結(jié)果茵宪。
所以以上就是char[16]和%02x的來(lái)歷。
至于人們說(shuō)的16位MD5加密瘦棋,其實(shí)是這樣的:舉例如果產(chǎn)生的MD5加密字符串是:01234567abcdefababcdefab76543210稀火,則16位的MD加密字符是abcdefababcdefab,也就是只是截取了中間的16位赌朋。實(shí)際上這個(gè)操作已經(jīng)不是MD5加密算法所包括的凰狞,而應(yīng)當(dāng)是對(duì)MD5加密算法結(jié)果的二次處理。其它的64位和大小寫(xiě)什么的沛慢,都屬于對(duì)MD5算法結(jié)果的二次處理赡若。因?yàn)镸D5算法產(chǎn)生的結(jié)果就是128bit,128個(gè)二進(jìn)制數(shù)字团甲。
以上就是我對(duì)MD5關(guān)于16位和32位的一些簡(jiǎn)單理解逾冬,呵呵。
OC的可以參考一下http://blog.csdn.net/a787188834/article/details/53244238