CRC 和类似计算(例如 Fletcher 和 Adler)的主要用途似乎是用于检测传输错误。因此,我看到的大多数研究似乎都解决了检测两个数据集之间小规模差异的概率问题。我的需求略有不同。
以下是对该问题的非常近似的描述。细节比这复杂得多,但下面的描述说明了我正在寻找的功能。这个小小的免责声明旨在避免诸如“当您可以更轻松地以我建议的其他方式解决问题时,您为什么要以这种方式解决问题?”之类的答案?- 由于无数与此问题或帖子无关的原因,我需要以这种方式解决我的问题,因此请不要发布此类答案。
我正在处理分布式网络上的数据集集合(大小~1MB)。对这些数据集执行计算,速度/性能至关重要。我想要一种机制来避免重新传输数据集。也就是说,我需要某种方法来为给定大小的每个数据集生成唯一标识符 (UID)。(然后,我将数据集大小和 UID 从一台机器传输到另一台机器,接收机器只需要根据 UID 在本地没有数据时请求传输数据。)
这类似于使用 CRC 检查文件更改和使用 CRC 作为摘要来检测文件之间的重复之间的区别。我没有看到任何关于后者使用的讨论。
我不关心篡改问题,即我不需要加密强度散列。
我目前正在使用序列化数据的简单 32 位 CRC,到目前为止,这对我很有帮助。但是,我想知道是否有人可以推荐哪种 32 位 CRC 算法(即哪个多项式?)最适合在这种情况下最小化冲突概率?
我的另一个问题有点微妙。在我当前的实现中,我忽略了我的数据集的结构,实际上只是对表示我的数据的序列化字符串进行 CRC。但是,由于各种原因,我想按如下方式更改我的 CRC 方法。假设我的顶级数据集是一些原始数据和一些从属数据集的集合。我目前的方案本质上是连接原始数据和所有从属数据集,然后是 CRC 的结果。但是,大多数时候我已经有了从属数据集的 CRC,我宁愿通过将原始数据与从属数据集的CRC连接起来,然后 CRC来构造我的顶级数据集的 UID这种结构。问题是,
用一种可以让我讨论我的想法的语言来表达,我将定义一些符号。调用我的顶级数据集T
,假设它由原始数据集R
和从属数据集组成Si, i=1..n
。我可以这样写T = (R, S1, S2, ..., Sn)
。如果&
表示数据集的拼接,我原来的方案可以认为是:
UID_1(T) = CRC(R & S1 & S2 & ... & Sn)
我的新方案可以被认为是
UID_2(T) = CRC(R & CRC(S1) & CRC(S2) & ... & CRC(Sn))
那么我的问题是:(1)如果T
和T'
非常不同,什么CRC算法最小化prob( UID_1(T)=UID_1(T') )
,什么CRC算法最小化prob( UID_2(T)=UID_2(T') )
,这两个概率如何比较?
我对此事的(天真和不知情的)想法是这样的。T
假设和之间的差异T'
仅在一个从属数据集中,WLOG 说S1!=S1'
。如果发生这种情况CRC(S1)=CRC(S1')
,那么显然我们将拥有UID_2(T)=UID_2(T')
。另一方面,如果CRC(S1)!=CRC(S1')
,则 和 之间R & CRC(S1) & CRC(S2) & ... & CRC(Sn)
的R & CRC(S1') & CRC(S2) & ... & CRC(Sn)
差异仅在 4 个字节上存在微小差异,因此 UID_2 检测差异的能力实际上与 CRC 检测传输错误的能力相同,即它仅检测错误的能力一些没有广泛分离的位。由于这是 CRC 的设计目的,我认为 UID_2 非常安全,只要我使用的 CRC 擅长检测传输错误。用我们的符号表示,
prob( UID_2(T)=UID_2(T') ) = prob(CRC(S1)=CRC(S1')) + (1-prob(CRC(S1)=CRC(S1'))) * probability of CRC not detecting error a few bits.
让我们称 CRC 未检测到几位错误的P
概率,以及它未检测到大型数据集上的大差异的概率Q
。上式可以大致写成
prob( UID_2(T)=UID_2(T') ) ~ Q + (1-Q)*P
现在我将更改我的 UID,如下所示。对于“基本”数据,即T=(R)
R 只是双精度、整数、字符、布尔值等的数据集,请定义UID_3(T)=(R)
. 然后对于T
由下级数据集向量组成的数据集T = (S1, S2, ..., Sn)
,定义
UID_3(T) = CRC(ID_3(S1) & ID_3(S2) & ... & ID_3(Sn))
假设一个特定的数据集T
具有嵌套层次深的从属数据集m
,那么,在某种模糊的意义上,我会认为
prob( UID_3(T)=UID_3(T') ) ~ 1 - (1-Q)(1-P)^m
鉴于这些概率在任何情况下都很小,这可以近似为
1 - (1-Q)(1-P)^m = Q + (1-Q)*P*m + (1-Q)*P*P*m*(m-1)/2 + ... ~ Q + m*P
因此,如果我知道我的最大嵌套级别m
,并且我知道P
并且Q
对于各种 CRC,我想要的是选择为我提供最小值的 CRC Q + m*P
。如果我怀疑可能是这种情况,P~Q
那么上面的内容就简化了。我对 UID_1 的错误概率是P
. 我对 UID_3 的错误概率是(m+1)P
,m
我的最大嵌套(递归)级别在哪里。
这一切看起来合理吗?