PHP中大字符串的按位运算

时间:2011-04-04 11:31:33

标签: php 32bit-64bit bitwise-operators

这是我的问题。出于兼容性原因,我目前正在尝试在PHP中实现一些加密标准。我现在正在研究的是SHA256和SHA512。它们都是相当直接的标准,我对此没有任何问题。

但是,SHA512需要对64位整数进行逐位运算。由于PHP只能有32位整数(使用编译),这让我有一个问题。如何实现必要的按位函数(模,转,旋转,添加,xor和/或等),以便我保持兼容性和合理的性能水平......

我知道其中一些实现这些功能的工作只需要2个32位整数。但是,这对shiftrotate有何影响?

我想到的是以二进制形式存储字符串(作为01010的字符串)。这样,所有按位操作都将完全独立于架构。但这可能会导致性能大幅下降,因为它们在标准中(以及库的其他部分)经常使用它们。

因此,我的问题是:如何在PHP的32位编译中轻松地允许至少64位字符串操作,同时仍然为每个步骤保持合理的性能级别......?

哦,我的目标是这里的便携性,所以没有扩展。我会考虑的其他图书馆,但它们必须是便携式的......

3 个答案:

答案 0 :(得分:3)

将值存储在字符串中确实是正确的方法。

但不是存储1和0,而是在每个字节中存储8位。从字符串中提取整数的部分仍然很容易。您需要手动执行所有操作,例如转移。

答案 1 :(得分:0)

显然,在给定您的环境的情况下,无法使用表示整数的本机数据结构,因此您必须在顶部使用数据结构。这当然意味着您将无法应用给定的示例... 0xFFFFFFFF>> 4但你可以使用mystruct(0xFFFFFFFF)>> 4(mystruct是你定义的数据结构)。

如果这听起来像一个计划让我知道,也许我可以帮助你解决剩下的问题。

答案 2 :(得分:-1)

您可以使用bcmath。它已经证明自己非常好,并且自4.0.4开始就与PHP一起使用