假设您有权访问“oracle”实现,您相信其输出是正确的。
最明显的方法似乎是通过实现运行一组已知的明文/哈希组合,并查看它们是否按预期输出。可以通过生成随机明文(使用静态种子以保持确定性)并使用预言机查找其哈希值来构造任意数量的此类情况。
我看到的主要问题是它不能保证能够解决可能的极端情况。生成更多案例将减少遗漏极端案例的可能性,但是多少个案例就足够了?
还有一个附带问题是指定这些随机明文的长度,因为 MD5 将任意长度的字符串作为输入。就我的目的而言,我不关心长输入(例如,任何超过 16 字节的内容),因此您可以在答案中使用这是一个“特殊用途”MD5 实现这一事实,如果它使事情变得更简单,或者您可以如果都是一样的话,回答一般情况。
如果出现算法错误,则很可能每个哈希值都是错误的。哈希本质上是无情的。
由于大多数可能的错误很快就会暴露出来,因此您实际上不需要那么多测试。要涵盖的主要内容是边缘情况:
如果这些全部通过,也许再加上对一两个以上代表性输入的测试,您可能会对您的算法非常有信心。没有那么多边缘情况(除非更熟悉算法细节的人可以想到更多)。