我期待生成一個唯一的數字字符串 - 最好是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的碰撞,你將成爲第一個。 –