计算“基础”数据校验和。 (SHA1 / 2等)

时间:2011-01-04 09:31:32

标签: c cryptography checksum data-integrity sha

我不确定如何问这个,但这是我希望的,给定一个可以包含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

然而,不出所料,在MD5SHA-n以及我调查的任何其他散列函数中,没有办法做到这一点,例如:

SHA-512
2fe2c1f01e39506010ea104581b737f95db6b6f71b1497788afc80a4abe26ab0
fc4913054278af69a89c152406579b7b00c3d4eb881982393a1ace83aeb7b6a2

SHA-256
77c2942e9095e55e13c548e5ef1f874396bfb64f7653e4794d6d91d0d3a168e2

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

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

我们需要的是校验和数据的方法(我可能会在这里偏向我的响应) - 这样我们就可以确定BA的超集,如果它包含所有相同的键,用相同的数据。但是,我们的struc中的键/值条目中通常会有很多数据每次都通过网络发送,只是为了确定我们已经看到了更完整的副本,这将是昂贵且浪费的。

2 个答案:

答案 0 :(得分:0)

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

如果你的用例总是在同一个顺序中有五个相同的键,那么你可以使用一个哈希用于强制键,一个用于可选键 - 但是你将无法检测到一个包含可选键的结构keys是另一个包含可选键的结构的超集。

略有不同的是,对所需的密钥使用一个哈希,对整个结构使用一个。

你也可以(根据你的要求)对键值对使用较小的校验和,以便能够快速丢弃不相同的东西 - 但是仍然需要更大的哈希来更准确地确定某些东西是匹配的

答案 1 :(得分:0)

加密哈希是专门为这些属性设计的:

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

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

如果您的密钥集是固定的,按固定顺序,总是完成并且只能通过新密钥扩展,并且每个密钥只有一个允许的表示,那么您可以计算五个旧密钥的哈希并将其与现有的哈希值。

如果密钥始终是唯一的,但这些集可以混合使用,那么您可以为每个密钥计算单独的哈希并存储,并在单独的数据库中搜索这些哈希值。

除此之外,加密哈希可能不适合这项工作。

[编辑]

另一种方法是首先按字母顺序对键进行排序,然后从排序集中获取哈希值。现在,无需关心订单即可识别您的设置。首先获取单个键的各个哈希值,对哈希值进行排序并将哈希值放在已排序哈希列表上可能更实际。这仍然需要唯一的密钥。