2012-05-09 47 views
1

我們有一個非重要的標籤,其值是一個字符串。我們想檢查標籤值的變化。但是我們不希望進行字符串比較,因爲這涉及到客戶端 - 服務器,而是我們想要爲字符串計算某種類型的值,並使用該值幫助檢測字符串更改。由於字符串不重要,我們想知道是否有一個非常簡單快速的解決方案來計算這個值,以幫助檢測字符串的變化。有沒有辦法快速計算字符串的簽名以幫助檢測字符串更改?

+3

string.hashcode()? (散列碼衝突的風險較低) – assylias

回答

2

使用.hashCode()

String.hashCode()是不完美的,因爲它是有損耗的。所以有可能字符串可能會改變,它會有相同的哈希碼。 (但這不會經常發生)幾乎每次字符串更改時,其哈希碼也會改變。

所以,你知道你要成什麼樣,爲String.hashCode()代碼是這樣的:

public int hashCode() { 
    int h = hash; // the cached hash value 
    int len = count; // the number of characters in the string 
    if (h == 0 && len > 0) { 
     int off = offset; 
     char val[] = value; 

     for (int i = 0; i < len; i++) { 
      h = 31*h + val[off++]; 
     } 
     hash = h; 
    } 
    return h; 
} 
+0

它會經常發生。 'int'只有32位寬。 –

+0

所以1/2^32往往是? –

+0

是的。 http://preshing.com/wp-content/uploads/2011/05/probability-distribution.png –

0

是。但是如果你需要唯一性,不要使用哈希碼。使用SHA256摘要。

String tag = "..."; 
MessageDigest md = MessageDigest.getInstance("SHA-256"); 
md.update(text.getBytes("UTF-8")); 
byte[] digest = md.digest(); 
+0

我想我不明白爲什麼字符串比較是不必要的,但字節數組比較會好嗎? –

+0

尺寸我猜...我也歡迎關於此問題的澄清問題。 –

相關問題