我正在通过实施一篇研究论文在 C# 中开展一个项目。现在我遇到了问题,我向两位作者发送了一封带有这张图片的邮件,但没有人回复
计算阈值的摘要算法有什么建议吗?
并且难以理解研究论文的映射功能。
研究论文 2,我认为两者都是相同的,只是有一点点变化。
这是您所处的不幸情况。两篇论文都缺乏清晰度和所有相关信息来完全复制该过程。旧论文甚至承认这一点(第 4 节,第 IX 步)。
无论如何,我们可以自己做一些澄清和侦探工作。
T
是之前计算的C
。C
使用计算没有歧义T
。阈值算法中的C很可能是Ch
. 在最近的论文中,第 II 部分的步骤 1 中说阈值计算取决于消息中的字符数。此外,在旧论文中,他们将字符数分配给C。考虑到两篇论文之间的复制量,如果他们忘记将C更改为Ch
. 不幸的是,他们没有提供计算因子(感兴趣的论文中的阈值)的算法,但我们可以假设他们至少已经将它写在未发表的某个地方,他们将其复制到新论文中以描述阈值算法。
说到X
,你就不走运了。我在论文的任何地方都没有找到它的其他参考资料,并且考虑了阈值函数的所有输入(Ch:字符总数,PL:密码,PM:密码)。这让我推测......如果......X
是C的错字,因为它们在键盘上彼此相邻?这也与返回值不大于 9 的算法一致。除了怀疑所有 mod 9 操作到处乱扔之外,旧论文明确说明了这一点(第 4 节,第 IX 步):
通常因子值在2到9的范围内,因为实际实验表明,超过这个值,块映射函数花费的时间太多,输出值超出范围。
总的来说,我推测正确的算法是这样的:
T = Ch % 9
T = T + PL
T = T % 9
T = T + [(9-Ch)((PL-PM)/PL)
但是,还有最后一点。(PL-PM)/PL
可以返回一个浮点数。如果您使用整数除法或 floor 函数(两者等效),该算法几乎与给出 2 到 9 之间的值一致。事实上,我得到 0 到 8 之间的值,但您可以将它们移动 1 以获得范围 1- 9.
如果一切都失败了,我可以建议您T
在可接受的范围内随机生成一个值吗?只要该值的生成不会造成算法的任何内部不一致,即T
必须按照论文中的描述进行计算,否则后面的某些步骤将无法正常运行,您应该没问题。
关于 的映射函数Bi
,等式 7 清楚地说明了函数是什么。与示例第 10 步(第 47 页)中描述的形式不一致的原因是错别字和在论文中途重新定义变量。明确地说,F 是一个拼写错误,T
而 u 与 相同C
,即单位的大小。出于某种愚蠢的原因(可能是因为它在旧论文中被如此定义),他们使用 u 而不是C
示例的步骤 3。它是 T 的 i 次方乘以 C 的 i 次方,或Math.Pow(T,i) * Math.Pow(C,i)
。
如果我可以在这一点上表达我的意见,他们定义映射函数的方式对我来说并不令人信服。他们说该函数的特征必须是生成的数字必须介于 1 和 B 之间,其中 B 是在高度和宽度分割后图像中的块数。他们还说不能发生冲突,否则您最终将两次嵌入到同一个块中,从而覆盖以前隐藏的信息。这些特征是合法和必要的,但它们的实施和对什么是最有效的争论是值得怀疑的。无需重新发明轮子,特别是对于随机数生成函数,因为您不能保证彻底调查它确实满足您的要求。
我会简单地生成一个数字列表 1, 2, 3, ..., B 然后随机播放。它保证没有超过限制的数量,不会发生冲突,并且您还保证了一个很好的随机顺序。最流行的洗牌算法是Fisher-Yates。这是 C# 中的一个实现。为确保嵌入和提取过程生成相同的随机顺序,您可以使用相同的种子初始化 PRNG,在这种情况下,可以是双方共享的密码。由于种子必须是整数并且密码是字符串,因此只需对其进行哈希处理。