2010-08-18 23 views
0
long make_checksum(const char* str) 
{ 
    long chk=0; 
    long rot=0; 
    while(*str) 
    { 
    rot<<=9; 
    rot|=(rot>>23); 
    rot^=*(char*)str++; 
    chk+=rot; 
    } 
    return chk; 
} 

不防水意味着:我有可能獲得兩個不同字符串的相同校驗和。校驗和計算是完全防水的嗎?

+0

您想問的問題是「校驗和值是否均勻分佈在所有可能的字符串中」,以及「如果我有一個randoml選擇的字符串,而另一個字符串與第一個字符串相同,除了非常少量的更改,我會統計得到兩個不同的校驗和值,所以我可以從錯誤的一箇中判斷出好的嗎?「。其他人已經解決了這個問題,並使用複雜的數學來解決問題。使用他們的解決方案之一。 CRC32(或CRC64)對此非常有用;許多其他的「哈希」函數也是如此。在運行時庫中通常會找到一個。 – 2010-08-18 09:06:33

回答

5

由於比long值有更多可能的字符串,所以肯定會有兩個不同的字符串產生相同的校驗和。

+3

+1,也被稱爲「鴿子原理」。 – 2010-08-18 09:02:01

+0

格雷格,+1教我新學期(鴿子的原理)。 – Patrick 2010-08-18 09:03:22

1

校驗和永遠不能防水,因爲它包含的數據比您計算校驗和的原始數據少。

如果你想要一個真正的防水'校驗和',你需要創建第二個'實例'的數據,並確保它包含與原始數據相同的數據,儘管它不必在相同的格式(可以加密或壓縮)。