Swift 3 faire sha1, sha256 et md5 fonctions
Dans Swift 2, j'ai utilisé le code suivant pour étendre les variables de chaîne et être en mesure de faire sha1, sha256, et md5.
Après le passage à la swift 3, le code ne fonctionne plus! J'ai essayé de le convertir, mais de l'exécuter en continu des erreurs.
Aucune idée de comment puis-je résoudre ce problème?
extension NSData {
func hexString() -> String {
var string = String()
for i in UnsafeBufferPointer<UInt8>(start: UnsafeMutablePointer<UInt8>(bytes), count: length) {
string += Int(i).hexString()
}
return string
}
func MD5() -> NSData {
let result = NSMutableData(length: Int(CC_MD5_DIGEST_LENGTH))!
CC_MD5(bytes, CC_LONG(length), UnsafeMutablePointer<UInt8>(result.mutableBytes))
return NSData(data: result)
}
func SHA1() -> NSData {
let result = NSMutableData(length: Int(CC_SHA1_DIGEST_LENGTH))!
CC_SHA1(bytes, CC_LONG(length), UnsafeMutablePointer<UInt8>(result.mutableBytes))
return NSData(data: result)
}
func SHA256() -> NSData {
let result = NSMutableData(length: Int(CC_SHA256_DIGEST_LENGTH))
CC_SHA256(bytes, CC_LONG(length), UnsafeMutablePointer(result!.mutableBytes))
return NSData(data: result!)
}
}
extension String {
func hexString() -> String {
return (self as NSString).dataUsingEncoding(NSUTF8StringEncoding)!.hexString()
}
func MD5() -> String {
return (self as NSString).dataUsingEncoding(NSUTF8StringEncoding)!.MD5().hexString()
}
func SHA1() -> String {
return (self as NSString).dataUsingEncoding(NSUTF8StringEncoding)!.SHA1().hexString()
}
func SHA256() -> String {
return (self as NSString).dataUsingEncoding(NSUTF8StringEncoding)!.SHA256().hexString()
}
}
- "Ne fonctionne plus" = ?
- signifie qu'il a besoin de changements à la swift 3 voies 🙁
- Avez-vous essayé le migrateur (ne ressemble pas)?
- Je l'ai fait, mais n'a pas de succès. j'ai donc mis le code original ici
- Voir MD2, MD4, MD5, SHA1, SHA224, SHA256, SHA384, SHA512 (Swift 3) dans la Documentation
Vous devez vous connecter pour publier un commentaire.
Vous feriez mieux d'utiliser Swift
Data
dans Swift 3.Données
Et lorsque l'on travaille avec
Data
, vous devez utiliserwithUnsafeBytes(_:)
ouwithUnsafeMutableBytes(_:)
, où vous avez été en utilisantbytes
oumutableBytes
respectivement.withUnsafeBytes(_:)
withUnsafeMutableBytes(_:)
Je préfère faire les propriétés calculées que l'absence de méthodes argument (pour relativement légères tâches). Vous avez besoin pour réparer toutes les parties à les utiliser, mais vous pouvez écrire quelque chose comme ceci:
Il peut y avoir plus rapidement un correctif pour votre code à l'aide de
NSData
, mais je vous recommande de vous déplacer àData
dans Swift 3.Int
extension est en fait pas nécessaire.hexString
dansData
peut être tout simplement créé avecself.map{ String($0, radix:16) }.joined()
String($0, radix:16)
dans votre code doit être quelque chose commeString(format: "%02X", $0)
.String($0, radix:16)
génère une Chaîne de longueur variable, 1...2 ("0"..."FF"). Vous ne pouvez pas récupérer l'original de la séquence d'octets sans chaque octet de prendre de longueur fixe de la représentation. La longueur peut être de 2, très probablement, mais pas nécessairement. J'ai donc continué à utiliser leInt
extension dans le code d'origine.Data
fonction map estUInt8
de sorte que la longueur de la chaîne est toujours 2print(String((0x01 as UInt8), radix: 16))
#import "CommonCrypto/CommonCrypto.h"
dans votre {Projet}-un pont-d'en-Tête.hextension Int{var hexString:String{return String(format: "%02X", self)}}
dans la réponse ci-dessus.Je trouve que la plupart de la réponse ok, mais si nous devons avoir une vraie solution universelle, je pense que nous avons besoin de monter d'un niveau.
CC_LONG
est juste unUInt32
et ne soutiendra pas vraiment de grandes structures de données.C'est ma solution dans Swift 3:
- Nous d'abord de créer une fondation qui œuvre avec
Data
:Pour des raisons de commodité, nous faire une extension de Données:
Et dernière extension de Chaîne:
Si nécessaire, convertir le résultat de
Data
de chaîne hexadécimale ou autre chose selon votre cas d'utilisation.Cette solution peut être utilisée pour Sha512, MD5 etc. pour obtenir de vrais solutions universelles avec Apple CommonCrypto qui sont faciles à étendre à plusieurs cas d'utilisation.
Pour l'achèvement, la plus courte et la plus flexible de la solution dans Swift 4 est: