2013-12-16 80 views
0

我期待生成一个唯一的数字字符串 - 最好是6-8位数字长,基于另一个字符串。Genrate基于另一个字符串的唯一数字字符串iOS

例如我有一个包含电子邮件地址的字符串。然后,当点击一个按钮,我得到另一个字符串包含一个独特的6-8位数字基于该电子邮件地址。

我很新鲜,所以任何详细的帮助将不胜感激! :)

谢谢,

+2

做MD5加密或SHA 256.它会有点长,但将是唯一的。 –

+1

@PranjalBikashDas这样的哈希不保证是唯一的。 – rmaddy

+1

这是用来干什么的?如果您提供详细信息,我们可能会提供更好的(读取标准)方法。 @rmaddy,如果你能找到与SHA 2的碰撞,你将成为第一个。 –

回答

4

其他人建议使用密码安全的MD5哈希。

如果你不关心加密安全,你也可以简单地使用内置的散列函数:

NSUInteger *emailHash = [emailAddressString hash]; 

既然你要转换为数字是一个电子邮件地址,它看起来像加密是矫枉过正。

+0

+1,使OP的生活更轻松。至于你对加密的担忧:这个散列与MD5一样是_cryptographic_。不多不少。哈希不能解密回原始字符串。你可以通过生成一组生成相同散列的字符串。 –

1

您可以创建一个MD5散列。

H2CO3公布了这一类别:NSString-MD5

你将不得不#import "NSString-MD5"

然后你就可以创建一个哈希:

NSString *emailHash = [email MD5Hash]; 

许可,没错,是公共领域。

正如rmaddy指出的那样:没有保证你会得到绝对唯一的值,适用于具有固定结果大小的任何哈希方法(即:对于无限数量的输入变体,结果数量有限)。

+1

虽然碰撞的几​​率很小,但MD5哈希不保证是唯一的。 – rmaddy

+0

这是绝对正确的。但是对于其他散列方法也是如此。 –

+0

不包含加密库意味着您必须检查“此程序是否包含加密”复选框,并可能限制非美国分发所得到的应用程序? –

1

在字符串上创建一个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; 
} 
相关问题