2013-12-16 191 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; 
} 
相關問題