1

我不确定如何问这个问题,但这是我所希望的,给定一个可能包含5+n键的结构(因此,我的系统有 5 个键是强制性的,其他键是可选的) - 我想要一个散列能够确定6具有相同键的键散列5是键结构的超集5并提供附加信息的机制。特别是散列机制,因为有一些约束阻止在每个请求上通过线路发送完整的结构。

为澄清起见,这里有一些信息(示例需要2+n密钥):

---
  name: codebeaker
  occupation: developer

用 散列SHA-512-256结果看起来像:

SHA-512
04fe500f2b3e779aba9ecb171224a04d35cc8453eb1521c7e31fd48b56b1cce9
b1e8af775e177e110982bfb16a6ca8652d7d9812ab8a8c316015dc9d6b3b54f7

SHA-256
4833be7086726e7ffd82db206f94f0a4f9fdf7fba00692f626157afed4587c74

当添加一个额外的键时,(下面的例子)我希望能够推断出扩展数据集是第一个的超集。

---
  name: codebeaker
  occupation: developer
  telephone: 49 (0) 123 45 67

但是,不出所料, inMD5以及SHA-n我研究过的任何其他散列函数,都没有办法做到这一点,例如:

SHA-512
2fe2c1f01e39506010ea104581b737f95db6b6f71b1497788afc80a4abe26ab0
fc4913054278af69a89c152406579b7b00c3d4eb881982393a1ace83aeb7b6a2

SHA-256
77c2942e9095e55e13c548e5ef1f874396bfb64f7653e4794d6d91d0d3a168e2

(显然)没有相似之处......

我们的用例,即格式化为结构的数据,由第 3 方输入到我们的系统中。处理数据非常昂贵,每次操作需要 2-3 秒,如果我们知道我们有上一次运行的结果,我们可以获得大约 50% 的时间,但是 - 贝叶斯和 Levenstein 文本差异算法不是适合这里,因为我们经常看到作为首字母缩略词的键/值对,以及在完全不相关时可能看起来相似的其他文本。

我们需要的是一种校验和数据的方法(我可能会偏向于我的回答)——这样我们就可以确定它是否包含所有相同的键和相同的数据B的超集。A然而,我们的键/值条目中经常有太多的数据,struc以至于每次通过网络发送它,只是为了确定我们已经看到了更完整的副本,这将是昂贵和浪费的。

4

2 回答 2

0

加密哈希是专门设计的具有以下属性:

  • 它们是单向函数。重新计算给定散列值的特定输入,甚至是散列到该值的任何随机输入,实际上是不可行的。
  • 尽管必须存在冲突,因为输入大小如果远大于固定输出大小,但实际上也无法找到两个不同的输入值导致相同的哈希值。
  • 完全相同的输入值总是散列到完全相同的散列值。
  • 输入的任何微小变化都会导致完全不同的哈希值。翻转任何单个输入位平均会改变输出位的 50%。

因此,加密哈希可以并且实际上用作任何二进制数据的唯一标识符。甚至 "name: codebeaker" 的哈希值也与 "name: Codebeaker" 不同。

如果您的一组键是固定的,以固定的顺序,始终完整且仅由新键扩展,并且每个键只有一个允许的表示形式,那么您可以计算五个旧键的哈希并将其与现有的哈希进行比较当前集。

如果键始终是唯一的,但集合可以混合,那么您可以为每个键计算单独的哈希,并将这些存储和搜索以在单独的数据库中查找现有集合。

除此之外,加密哈希可能不是这项工作的正确工具。

[编辑]

另一种方法是首先按字母顺序对键进行排序,然后从排序集中获取哈希值。这现在可以识别您的集合,而无需关心订单。首先获取单个键的单个哈希值,然后对哈希值进行排序,然后对排序的哈希值列表进行哈希处理,这可能更实用。这仍然需要唯一键。

于 2011-01-04T10:04:07.693 回答
0

一个想法是对每个键值对使用不同的哈希值。因此,完整结构的“散列”是散列的集合。

如果您的用例始终是五个相同顺序的相同键,然后是任何其他键,您可以使用一个散列作为强制键,一个用于可选键 - 但是您将无法检测到一个包含可选键的结构是另一个包含可选键的结构的超集。

一个细微的变化是对所需的键使用一个散列,对整个结构使用一个散列。

您还可以(根据您的要求)对键值对使用较小的校验和,以便能够快速丢弃不一样的东西 - 但仍然需要更大的散列来更准确地确定某些东西是匹配的。

于 2011-01-04T09:53:39.990 回答