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;
}
不防水意味着:我有可能獲得兩個不同字符串的相同校驗和。校驗和計算是完全防水的嗎?
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;
}
不防水意味着:我有可能獲得兩個不同字符串的相同校驗和。校驗和計算是完全防水的嗎?
由於比long值有更多可能的字符串,所以肯定會有兩個不同的字符串產生相同的校驗和。
+1,也被稱爲「鴿子原理」。 – 2010-08-18 09:02:01
格雷格,+1教我新學期(鴿子的原理)。 – Patrick 2010-08-18 09:03:22
校驗和永遠不能防水,因爲它包含的數據比您計算校驗和的原始數據少。
如果你想要一個真正的防水'校驗和',你需要創建第二個'實例'的數據,並確保它包含與原始數據相同的數據,儘管它不必在相同的格式(可以加密或壓縮)。
您想問的問題是「校驗和值是否均勻分佈在所有可能的字符串中」,以及「如果我有一個randoml選擇的字符串,而另一個字符串與第一個字符串相同,除了非常少量的更改,我會統計得到兩個不同的校驗和值,所以我可以從錯誤的一箇中判斷出好的嗎?「。其他人已經解決了這個問題,並使用複雜的數學來解決問題。使用他們的解決方案之一。 CRC32(或CRC64)對此非常有用;許多其他的「哈希」函數也是如此。在運行時庫中通常會找到一個。 – 2010-08-18 09:06:33