2012-07-07 67 views
0

在我正在編寫的程序中,我想開發一種哈希算法,該算法可以將RGB顏色,字符串或二者都映射到唯一且相對較小的索引。開發哈希算法:將RGB顏色ID和字符串轉換爲Int

這裏的目標是減少儘可能多的碰撞,保證沒有兩種顏色通過算法是類似的(感知;例如紅色,藍色,橙色)。

由於我的知識有限,數組似乎是直接訪問數據結構的最佳選擇,但我不想創建一個令人難以置信的大數組。鑑於我必須在C++中爲數組分配內存,我在開發這樣的算法時遇到了問題。

任何提示,感激!

+1

RGB顏色是否每個顏色元素有8位? (總共24位)。然後我沒有看到它散列的點。另外,爲什麼不使用CRC32呢?你可以用它來散列任何數據。但是正如所說的,它沒有意義用CRC32來散列小於或等於32位的數據。 – Rookie 2012-07-07 14:55:44

+0

它有每個元素8位。請原諒我的問題,但爲什麼沒有必要對它進行散列呢?正如你所看到的,我仍然在搞清楚什麼東西。 – 2012-07-07 14:59:31

+0

你能解釋一下這一切的目的嗎?我無法理解爲什麼你需要散列。你只是想通過一些隨機值訪問某個數組元素,例如你想要做些什麼:'elements [「color_string_here」] = 1337'和'elements [0xFE63AA37CB] = 1337',然後訪問那個元素並獲得'1337'的價值......? – Rookie 2012-07-07 15:01:44

回答

1

您可以使用std::map按顏色或標籤訪問Subject。不需要爲此開發自己的哈希算法,只需要創建比較運算符,在這種情況下應該很容易,假設您使用RGB顏色的32位整數,而label使用std::string

編輯:其實你不需要做任何東西比圖(無運營商定製),就這麼簡單:

typedef map<int, MyClass*, greater<int> > IntClassMap; 
typedef map<std::string, MyClass*, greater<std::string> > StrClassMap; 
IntClassMap inttable; 
StrClassMap strtable; 

void adding_the_data(){ 
    inttable[0x11223344] = myclasspointer1; 
    inttable[0x11223345] = myclasspointer2; 
    inttable[0x11223346] = myclasspointer3; 

    strtable["test string1"] = myclasspointer1; 
    strtable["test string2"] = myclasspointer2; 
    strtable["test string3"] = myclasspointer3; 
} 

void accessing_example(){ 
    strtable["test string1"]->something; 
} 

std::map是非常快的,我不認爲你需要(或找到)比這更快的解決方案。

+0

爲什麼選擇更大的比較器有什麼具體原因嗎?從我所能看到的情況來看,它默認較少。 – 2012-07-07 15:38:07

+0

@JTCho,因爲某種原因,我總是使用更多的東西,我不記得了,我想我遇到了一些問題,所以我選擇「更大」來解釋一些不爲人知的神祕原因。但我想它也適用於'less'。 – Rookie 2012-07-07 15:52:37

+0

我明白了。感謝您的幫助!這是非常讚賞。 – 2012-07-07 16:53:59