我期待生成一个唯一的数字字符串 - 最好是6-8位数字长,基于另一个字符串。Genrate基于另一个字符串的唯一数字字符串iOS
例如我有一个包含电子邮件地址的字符串。然后,当点击一个按钮,我得到另一个字符串包含一个独特的6-8位数字基于该电子邮件地址。
我很新鲜,所以任何详细的帮助将不胜感激! :)
谢谢,
我期待生成一个唯一的数字字符串 - 最好是6-8位数字长,基于另一个字符串。Genrate基于另一个字符串的唯一数字字符串iOS
例如我有一个包含电子邮件地址的字符串。然后,当点击一个按钮,我得到另一个字符串包含一个独特的6-8位数字基于该电子邮件地址。
我很新鲜,所以任何详细的帮助将不胜感激! :)
谢谢,
其他人建议使用密码安全的MD5哈希。
如果你不关心加密安全,你也可以简单地使用内置的散列函数:
NSUInteger *emailHash = [emailAddressString hash];
既然你要转换为数字是一个电子邮件地址,它看起来像加密是矫枉过正。
+1,使OP的生活更轻松。至于你对加密的担忧:这个散列与MD5一样是_cryptographic_。不多不少。哈希不能解密回原始字符串。你可以通过生成一组生成相同散列的字符串。 –
您可以创建一个MD5散列。
H2CO3公布了这一类别:NSString-MD5
你将不得不#import "NSString-MD5"
。
然后你就可以创建一个哈希:
NSString *emailHash = [email MD5Hash];
许可,没错,是公共领域。
正如rmaddy指出的那样:没有保证你会得到绝对唯一的值,适用于具有固定结果大小的任何哈希方法(即:对于无限数量的输入变体,结果数量有限)。
虽然碰撞的几率很小,但MD5哈希不保证是唯一的。 – rmaddy
这是绝对正确的。但是对于其他散列方法也是如此。 –
不包含加密库意味着您必须检查“此程序是否包含加密”复选框,并可能限制非美国分发所得到的应用程序? –
在字符串上创建一个md5散列。 CC_MD5返回16个字节。如果您想要占用8个字节,则可以丢弃其他字节,但需要检查唯一性(与先前接收或存储的值进行比较)。
#import <CommonCrypto/CommonDigest.h>
#import <CommonCrypto/CommonHMAC.h>
#import <CommonCrypto/CommonCryptor.h>
+ (NSString *)md5String:(NSString *)plainText
{
if(plainText == nil || [plainText length] == 0)
return nil;
const char *value = [plainText UTF8String];
unsigned char outputBuffer[CC_MD5_DIGEST_LENGTH];
CC_MD5(value, strlen(value), outputBuffer);
NSMutableString *outputString = [[NSMutableString alloc] initWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
for(NSInteger count = 0; count < CC_MD5_DIGEST_LENGTH; count++){
[outputString appendFormat:@"%02x",outputBuffer[count]];
}
NSString * retString = [NSString stringWithString:outputString];
[outputString release];
return retString;
}
做MD5加密或SHA 256.它会有点长,但将是唯一的。 –
@PranjalBikashDas这样的哈希不保证是唯一的。 – rmaddy
这是用来干什么的?如果您提供详细信息,我们可能会提供更好的(读取标准)方法。 @rmaddy,如果你能找到与SHA 2的碰撞,你将成为第一个。 –