擅长:python、mysql、java
<p>我建议原来的校验和函数是“不正确的”。为checksum返回的值大小不受限制(对于任何给定的大小(以MB为单位),您可以构造一个输入,其校验和大小至少为这个大小)。如果我的计算是正确的,对于小于260MB的输入,该值可以容纳64位,而对于小于4096个字节的输入,<code>b</code>可以容纳一个整数。现在,我可能不再讨论这个数字,但这意味着对于更大的输入,这两个函数的工作方式肯定是不同的。在</p>
<p>要将第一个函数转换为C,需要在Python整数中保留<code>b</code>和{<cd3>},并将最后一个计算作为Python表达式执行。不过,这一点还可以改进:</p>
<ul>
<li>您可以使用C<code>long long</code>变量存储一个中间和,并在经过一定次数的迭代后将其添加到Python整数中。如果迭代次数是<code>n</code>,那么<code>a</code>的最大值是<code>n * 255</code>,而{<cd1>}的最大值是<code>len(data) * n * 255</code>。当将它们存储在C<code>long long</code>变量中时,请尝试将它们保存在<code>2**63-1</code>下。在</li>
<li>您可以使用<code>long long</code>而不是<code>unsigned long long</code>,并且在调试模式下,每当<code>RuntimeError</code>为负值时,都会引发它。在</li>
</ul>
<p>另一个解决方案是通过使用<code>a & 0xffffffffffffffff</code>和<code>b & 0xffffffffffffffff</code>将Python等效值限制为64位。在</p>
<p>最好的解决方案是使用另一种校验和,比如<code>binascii.crc32</code>。在</p>