在objective-c中,它看起来像这样:
#include <sys/xattr.h>
@implementation NSString (reverse)
-(NSString*)sha1
{
NSData *data = [self dataUsingEncoding:NSUTF8StringEncoding];
uint8_t digest[CC_SHA1_DIGEST_LENGTH];
CC_SHA1(data.bytes, (int)data.length, digest);
NSMutableString *output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
for (int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++)
[output appendFormat:@"%02x", digest[i]];
return output;
}
@end
我需要这样的东西与Swift,这是可能的吗?
请展示工作示例。
8条答案
按热度按时间8i9zcol21#
你的Objective-C代码(使用
NSString
类别)可以直接翻译成Swift(使用String
扩展)。首先,你必须创建一个“桥接头”,并添加
然后:
这可以写得稍微短一点,更快一点
Swift 2更新:
要返回Base-64编码的字符串而不是十六进制编码的字符串,只需替换
与
Swift 3的更新:
要返回Base-64编码的字符串而不是十六进制编码的字符串,只需替换
作者
Swift 4更新:
不再需要桥接头文件,可以使用
import CommonCrypto
:Swift 5更新:
Data.withUnsafeBytes()
方法现在使用UnsafeRawBufferPointer
to调用闭包,baseAddress
用于将初始地址传递给C函数:t5zmwmid2#
随着
CryptoKit
在iOS13中的加入,我们现在有了原生的Swift API:cngwdvgl3#
Swift 5的一个版本,在iOS 13上使用CryptoKit,否则福尔斯退到CommonCrypto:
用法:
也可通过Swift包管理器使用:
https://github.com/ralfebert/TinyHashes
yh2wf1be4#
是的,这是可能的,复制这个类到您的项目。https://github.com/idrougge/sha1-swift
这将是容易的,就像:
已测试Swift 3和Swift 4。
06odsfpq5#
要获得
NSData
形式的结果,假设您在桥接头中包含了<CommonCrypto/CommonCrypto.h>
:也使用正确的指针分配。像这样调用它:
如果你需要
NSData
的十六进制表示,看看我的其他答案。eulz3vhy6#
我们可以通过三个步骤提取使用sha1加密字符串的逻辑:
1.将字符串转换为数据对象
1.使用SHA1函数对数据进行加密
1.将数据对象转换为十六进制字符串
恕我直言,它的可读性更强,这个版本不需要NSData。
xriantvc7#
是的,有可能:* 使Objective-C代码可从Swift访问 *
参见文件。
如果你得不到任何好处(比如使用swift特有的特性),我会避免用swift重写它。
另外,在我正在做的一个项目中,我使用了一些类似于你的objtive-c代码来处理散列。一开始我用swift编写它,然后我意识到重用旧的obj-c更容易,更好。
abithluo8#
对于一行程序的家伙,没有必要使用令人毛骨悚然的swift扩展
斯威夫特5.7.3