2012-07-07 121 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