【问题标题】:Developing a Hashing Algorithm: RGB Color ID and String to Int开发散列算法:RGB 颜色 ID 和字符串到 Int
【发布时间】:2012-07-07 17:25:06
【问题描述】:

在我正在编写的程序中,我想开发一种散列算法,它可以将 RGB 颜色、字符串或两者都映射到唯一且相对较小的索引。

这里的目标是尽可能减少冲突,同时保证没有两种颜色通过算法是相似的(在感知上;例如红色、蓝色、橙色)。

以我有限的知识,数组似乎是直接访问数据结构的最佳选择,但我不想创建一个非常大的数组。鉴于我必须在 C++ 中为数组分配内存,我在开发这样的算法时遇到了麻烦。

感谢任何提示!

【问题讨论】:

  • RGB 颜色每个颜色元素有 8 位吗? (共 24 位)。然后我看不到散列它的意义。另外,你为什么不直接使用 CRC32 呢?你可以用它散列任何数据。但如前所述,使用 CRC32 对小于或等于 32 位的数据进行散列是没有意义的。
  • 每个元素确实有 8 位。请原谅我的问题,但为什么没有必要散列呢?如您所见,我仍在解决问题。
  • 您能解释一下这一切的目的吗?我无法理解为什么需要散列。您是否只想通过某个随机值访问某个数组元素,例如您是否想执行以下操作:elements["color_string_here"] = 1337elements[0xFE63AA37CB] = 1337,然后访问该元素并获取1337 值...?
  • 散列的目的是将较大的数据压缩成可以快速比较的简单值。例如,如果该值的大小为 32 位,则不需要对其进行散列,因为您可以轻松比较 32 位值。但我不知道您要做什么,也许您想要 16 位或 8 位哈希?我不知道。
  • 我有一个“主题”类,它有两个与之关联的对象:一个字符串标签和一个颜色(8 位 RGB)。在我的程序中,我需要收集一些上述主题,从中我可以通过颜色或标签轻松快速地访问主题。

标签: c++ arrays string colors hash


【解决方案1】:

您可以使用std::map 通过颜色或标签访问Subject。无需为此开发自己的哈希算法,您所要做的就是创建比较运算符,在这种情况下这应该很容易,假设您使用 32 位整数作为 RGB 颜色,并使用 std::string 作为label

编辑:其实你不需要做任何东西,除了地图(没有自定义操作符),就像这样简单:

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 非常快,我认为您不需要(或找到)比这更快的解决方案。

【讨论】:

  • 您选择更大作为比较器有什么具体原因吗?据我所知,它默认为 less。
  • @JTCho,我一直使用更大的原因,我不记得了,我想我遇到了一些问题,所以我选择了greater,因为一些未知的神秘原因。但我想它也适用于less
  • 我明白了。谢谢您的帮助!非常感谢。
猜你喜欢
  • 2012-06-22
  • 2011-04-22
  • 2014-04-25
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
  • 2016-10-14
  • 2017-01-09
  • 1970-01-01
相关资源
最近更新 更多