热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP中大字符串的按位运算-BitwiseOperationsOnLargeStringsInPHP

Heresmyproblem.ImcurrentlytryingtoimplementafewCryptographystandardsinPHPforcompati

Here's my problem. I'm currently trying to implement a few Cryptography standards in PHP for compatibility reasons. The one I'm working on now is SHA256 and SHA512. They are both reasonably straight forward standards, and I'm not having an issue with that.

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

However, SHA512 requires bitwise operations on 64 bit integers. Since PHP can have only 32 bit integers (with the compile), that leaves me with a problem. How do I implement the bitwise functions necessary (modulo, shift, rotate, add, xor, and, or, etc) so that I both maintain compatibility and a reasonable level of performance...

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

I know for some of them implementing the functions is trivially done with 2 32 bit ints. However, how will that work for shift and rotate?

我知道其中一些实现这些功能的工作只需要2个32位整数。但是,如何进行转换和旋转?

What I've thought of doing is storing the strings in binary form (as a string of 01010). That way all bitwise operations will be completely architecture independent. But this will likely cause a massive performance drop since they are used incredibly frequently in the standards (and in other parts of the library).

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

So my question is thus: How can I easily allow for at least 64 bit string operations in a 32 bit compile of PHP while still maintaining a reasonable level for performance for every step...?

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

Oh, and my aim is portability here, so no extensions. Other libraries I'll consider, but they must be portable...

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

3 个解决方案

#1


2  

Storing the values in strings is really the right way to go.

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

But instead of storing 1's and 0's, just store 8 bits in every byte. It will still be easy to extract parts of the integer from your string. You do need to manually do all operations such as shifting.

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

#2


0  

You could use bcmath. It has proven itself very good and goes with PHP since 4.0.4

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

#3


0  

Clearly there is no way to use the native data structure that represents ints given your environment and so you have to use a data structure on top. This will mean of course that you will not be able to apply your example given ... 0xFFFFFFFF >> 4 but you could use mystruct(0xFFFFFFFF) >> 4 (mystruct being the data structure defined by you).

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

If this sounds like a plan let me know and maybe I can help you with the rest of the solution.

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


推荐阅读
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文介绍了在多平台下进行条件编译的必要性,以及具体的实现方法。通过示例代码展示了如何使用条件编译来实现不同平台的功能。最后总结了只要接口相同,不同平台下的编译运行结果也会相同。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 配置IPv4静态路由实现企业网内不同网段用户互访
    本文介绍了通过配置IPv4静态路由实现企业网内不同网段用户互访的方法。首先需要配置接口的链路层协议参数和IP地址,使相邻节点网络层可达。然后按照静态路由组网图的操作步骤,配置静态路由。这样任意两台主机之间都能够互通。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
author-avatar
企鹅田先生
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有