我不确定如何问这个,但这是我希望的,给定一个可以包含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
然而,不出所料,在MD5
,SHA-n
以及我调查的任何其他散列函数中,没有办法做到这一点,例如:
SHA-512
2fe2c1f01e39506010ea104581b737f95db6b6f71b1497788afc80a4abe26ab0
fc4913054278af69a89c152406579b7b00c3d4eb881982393a1ace83aeb7b6a2
SHA-256
77c2942e9095e55e13c548e5ef1f874396bfb64f7653e4794d6d91d0d3a168e2
(显然)没有相似之处......
我们的用例,这个格式化为结构的数据由第三方提供给我们的系统。处理数据非常昂贵,每次操作2-3秒,我们可以得到大约50%的时间,如果我们知道我们有前一次运行的结果,但是 - 贝叶斯和Levenstein文本差异算法不是这里适用,因为我们经常看到作为首字母缩写词的键/值对,以及在完全不相关时可能看起来相似的其他文本。
我们需要的是校验和数据的方法(我可能会在这里偏向我的响应) - 这样我们就可以确定B
是A
的超集,如果它包含所有相同的键,用相同的数据。但是,我们的struc
中的键/值条目中通常会有很多数据每次都通过网络发送,只是为了确定我们已经看到了更完整的副本,这将是昂贵且浪费的。
答案 0 :(得分:0)
一个想法是每个键值对使用不同的哈希值。因此,完整结构的“哈希”是哈希的集合。
如果你的用例总是在同一个顺序中有五个相同的键,那么你可以使用一个哈希用于强制键,一个用于可选键 - 但是你将无法检测到一个包含可选键的结构keys是另一个包含可选键的结构的超集。
略有不同的是,对所需的密钥使用一个哈希,对整个结构使用一个。
你也可以(根据你的要求)对键值对使用较小的校验和,以便能够快速丢弃不相同的东西 - 但是仍然需要更大的哈希来更准确地确定某些东西是匹配的
答案 1 :(得分:0)
加密哈希是专门为这些属性设计的:
因此,加密哈希可以并且实际上用作任何二进制数据的唯一标识符。甚至“name:codebeaker”的哈希值也不同于“name:Codebeaker”。
如果您的密钥集是固定的,按固定顺序,总是完成并且只能通过新密钥扩展,并且每个密钥只有一个允许的表示,那么您可以计算五个旧密钥的哈希并将其与现有的哈希值。
如果密钥始终是唯一的,但这些集可以混合使用,那么您可以为每个密钥计算单独的哈希并存储,并在单独的数据库中搜索这些哈希值。
除此之外,加密哈希可能不适合这项工作。
[编辑]
另一种方法是首先按字母顺序对键进行排序,然后从排序集中获取哈希值。现在,无需关心订单即可识别您的设置。首先获取单个键的各个哈希值,对哈希值进行排序并将哈希值放在已排序哈希列表上可能更实际。这仍然需要唯一的密钥。