2014-04-02 80 views
0

我正在尋找編碼使用散列函數存儲在字符串中的一組十六進制值。由於十六進制「英文字母」僅由16個字母組成,因此碰撞最少的最佳散列算法是什麼?什麼是十六進制字符串的最佳散列函數?

+0

'atoi(str);'或者它在C++中是等價的,那麼碰撞將不會達到MAX_INT。 –

+0

@AkiSuihkonen碰撞釋放MAX_INT和未定義的行爲,沒有辦法做到有意義的錯誤恢復。這就是爲什麼我們現在有strtol()。請不要推薦使用atoi()。 – fstd

+0

沒有理由相信任何熟知的通用散列函數(例如djb2或murmur(僅舉兩個簡單示例))對於十六進制字符串的執行效果不佳,或者至少不會比其他任何散列函數執行得更差。超短密鑰(1-3字節)總是非常糟糕,沒有多少人可以做到這一點,任何合理的工作都相當好。 – Damon

回答

1

這是一個過於籠統的問題,因爲您忽略了對散列函數的任何約束,以及/或者您將如何處理散列。 (在旁註中,哈希不是編碼)

這就是說,有一個16個字母的字母表,你需要4位來存儲每個(即你可以建立一個XOR總和每兩個字母擠進一個單一的字節,得到一個8位的散列
當然,這可以擴展到任何其他字長,太(但你留下了太多信息)

比如像這樣:

uint8_t
hexhash(const char *str)
{
                uint8_t res = 0;
                while (*str && *(str+1)) {
                                res ^= (fromchar(*str) << 4) | fromchar(*(str+1));
                                str += 2; //編輯:忘了這在我原來的答覆
                }
                return res;
}

(其中 'fromchar' 是爲 '0' 返回0的函數,1 '1',...,15爲 'F' )

相關問題