【问题标题】:Generate Hash Key of (void *) data生成 (void *) 数据的哈希键
【发布时间】:2012-04-17 21:51:57
【问题描述】:

我想知道如何生成无效数据的哈希键。

我正在开展一个网络项目并处理数据包。我必须生成哈希表。在哪个数据包头上进行散列。但我不知道数据包头的结构或类别。所以,关于这个的任何想法。我只是想将其转换为无效。并对无效数据进行散列以生成散列键。

任何其他想法。 GOOD Logic 将受到欢迎。

【问题讨论】:

  • 基本上这行不通。从 Java 的角度考虑,hashCode 必须与 equals 一致。如果你对数据一无所知,你怎么知道两个是否相等——除了比较每个字节?如果你不知道它们是否相等,你怎么能期望在哈希表中找到它们?
  • 谢谢...好的,这绝对正确。但我的想法不同。假设有一个 void 类型的数据。我们必须把它保存在一个表格中。
  • 如果(a)你知道它们有多长,并且(b)你愿意接受长度相等加上字节相等作为你对相等的定义,那么散列和比较数据块就不难了的两个 blob。这个问题很简单,但你还没有真正说出你卡在哪里,所以人们很难提供好的答案。
  • 附加评论:“如何生成无效数据的哈希键” 措辞不当。没有“空数据”,void* 是指向 unspecified 类型数据的指针,但您不能实例化 void 类型的变量。相反,您会将指向 void 另一端的事物视为字节数组(通常由 charunsigned char 表示(或在字节为八位字节 int8_t 或 @987654326 的机器上) @))。
  • 你至少知道数据的大小吗?否则,您将无法正确使用它,因为您将面临访问无效内存的风险。

标签: c++ hashtable hash ns-3


【解决方案1】:

CityHash,有一个我认为适合你输入的功能:

// Hash function for a byte array.
uint64 CityHash64(const char *buf, size_t len);

据我所知,将 char 用作输入类型只是为了方便 - 例如,它并不意味着如果函数找到零字节就会停止散列。

还有一个 128 位的版本,等等。

【讨论】:

    【解决方案2】:

    您可以使用任何接受任何类型指针的哈希函数,只要它也接受缓冲区的长度即可。只需投射指针并使用它。大多数哈希函数将使用char * 输入和size_t 长度。

    不过,从您的问题来看,您可能没有标题的长度。没有这个长度是不行的。

    【讨论】:

    • 谢谢...长度问题没什么,我有。因为有很多功能。但我想这样做。 :)。一个笨蛋,我正在做的是 char *a = &(char)(void)(ccHrd);这是我知道错了,但是。它告诉我我正在尝试做的事情。
    猜你喜欢
    • 2012-11-19
    • 2018-06-18
    • 1970-01-01
    • 2021-12-07
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    相关资源
    最近更新 更多