关于Encode64加密算法在数据量大时很慢的问题?

znhyz1 2013-10-18 10:00:46
方法:function Encode64(const test:string): string;
test量大时算法效率很低,需要几分钟才运算完。。。

function Encode64(const test:string): string;
var
s, s1: string;
i, p, len, n, Addnum: integer;

begin
result := '';

S := '';
for i := 1 to length(test) do
S := S + IntToHex(Ord(test[I]), 2);
//将字符串的十六进制数以字符串的形式表示出来
case (length(s) mod 3) of
0: addnum := 0;
1:
begin
s := s + '00';
addnum := 2;
end;
2:
begin
s := s + '0';
addnum := 1;
end;
else
addnum := 0;
end;
len := length(s) div 3;
for i := 1 to len do
begin
s1 :=Midstr(S, i*3-2,3);
p := strtoint('$' + s1);
n := p div 64;
result := result + basetable[n+1];
n := p mod 64;
result := result + basetable[n+1];
end;
if addnum = 1 then
result := result + '==';
if addnum = 2 then
result[length(result)] := '=';
end;
...全文
208 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
蓝色光芒 2013-10-21
  • 打赏
  • 举报
回复
从你的算法来看: S := ''; for i := 1 to length(test) do S := S + IntToHex(Ord(test[I]), 2); //只取了2位,因此只支持AnsiString 这是一个专为AnsiString而设计的函数. 另外楼主的函数和EncodeString的结果不一致,比如字符串长度>=56的时候. 100M AnsiString用EncodeString的时间大概1秒左右.应该是可以接受的,而且这个函数是标准函数.加和解都没问题.(D7,Win7,i5,4G环境测试的) 另:发一个优化后的代码给你,是完全根据你的函数改写的,结果和你的函数结果一致.仅作为代码算法研究参考,建议用系统自带的那2个函数. 100M AnsiString执行时间0.23秒,同样只能使用AnsiString
function Encode64Fast(const Input : AnsiString): AnsiString;
var
  pDest , pSour : PChar;
  i , Count : integer;
  w : DWORD;
  B : Boolean;
begin
  if Input='' then begin
    Result := '';
    exit;
  end;
  SetLength(Result , Length(Input)*3 DIV 2 + 100);//预设长度
  pDest := Pointer(Result);
  pSour := Pointer(Input);
  Count := 0;
  B := False;
  for i:=1 to (Length(Input)+1)*2 DIV 3 do begin  //计算部分
    w := ((PByte(pSour)^ SHL 8) or (PByte(pSour+1)^));//不支持BSWAP,因此只能这样了
    inc(pSour);
    if not B then w := w SHR 4
    else begin
      w := w AND $0FFF;
      inc(pSour);
    end;
    B := Not B;

    pDest^ := BaseTable[(w SHR 6 ) + 1];  //代替 DIV 64
    inc(pDest);
    pDest^ := BaseTable[(w and 63) + 1];  //代替 MOD 64
    inc(pDest);
    inc(Count , 2);
  end;

  case (Length(Input)*2 mod 3) of
    1: (pDest-1)^ := '=';
    2: begin
         pDest^ := '=';
         inc(pDest);
         pDest^ := '=';
         inc(Count , 2);
       end;
  end;
  Delete(Result , Count+1 , Length(Result));
end;
znhyz1 2013-10-20
  • 打赏
  • 举报
回复
引用 1 楼 kiboisme 的回复:
如果指定了用这个算法,那就对这个算法作优化,优化如下: 1.给S,Result字符串预设长度,并用Move,或者PWORD^/PDWORD^进行操作 2.用PChar来循环字符串 3.针对该算法专门写一个IntToHex2,StrToInt2,以及Midstr(这个其实可以不要),来提交速度 理论上,100M的数据,这个算法,2秒内应该可以完成,内存足够的话,100M test数据需要400M左右的内存
如何改进?能给个具体的例子吗?
chenpingqq 2013-10-20
  • 打赏
  • 举报
回复
几分钟有点夸张吧。 自带就有这个函数, 在EncdDecd单元里。 function EncodeString(const Input: string): string; //加密 function DecodeString(const Input: string): string; //解密
蓝色光芒 2013-10-18
  • 打赏
  • 举报
回复
如果指定了用这个算法,那就对这个算法作优化,优化如下: 1.给S,Result字符串预设长度,并用Move,或者PWORD^/PDWORD^进行操作 2.用PChar来循环字符串 3.针对该算法专门写一个IntToHex2,StrToInt2,以及Midstr(这个其实可以不要),来提交速度 理论上,100M的数据,这个算法,2秒内应该可以完成,内存足够的话,100M test数据需要400M左右的内存
课程亮点: 从无到有、手把手教你编写CA/TA,快速上手,快速部署项目标准的开发,开发一套CA/TA,可部署到不同的TEE OS上。受益人群: 汽车行业主机厂、tier1、SOC芯片公司的安全部门同事手机行业,ODM/OEM、SOC芯片公司的安全部门同事学生课程收益: 熟悉CA/TA开发的步骤和流程。快速上手,快速搭建自己开发环境。熟悉各类TEE、基于各类TEE的CA/TA开发步骤。搭建自己的安全平台熟悉各类常规安全应用熟悉tee密码学算法、tee存储  课程大纲  Hello大家好,上架一门新的视频课程,课程主要包含两大部分,第一部分搭建环境,第二部分从无到有的编写代码。带领大家手把手编写。 具体大纲如下:(1)qemu v8环境搭建- 搭建一个qemu_v8的环境,用于跑BL1-->BL2-->BL31-->BL32-->BL33-->Linux kernel;- 直接使用已搭建好的镜像- 工程使用以及说明(2)CA/TA开发编程实践从无到有编写代码,已完成的大纲如下:- 2秒钟快速编写(clone)一组CA/TA程序- 安全存储详解以及代码示例- CA到TA双向传参数的四种方式(value、temref、memref),区别?优缺点?- 对称密码学算法aes的使用,CBC/ECB/CTR/XTS分组密码的使用,加密解密,pending等- aeskey的操作,如何随机生成aeskey(TEE_GenerateKey),objectHandle和aesbuf有什么区别? 如何将handle- 认证加密算法,如aes-GCM的使用- 非对称密码学算法RSA的使用,包括加密、解密、签名、验签- RSA key的处理,包含如何生成RSA KEY,rsakey object如何转换成可见的数组,如何转换der,如何转换pem,反向又如何转换- ECC/ECDSA的使用- 国密sm2 sm3 sm4的使用.  其中sm4包含加密、解密、签名、验签等- encode和decode的实现- TA属性的定制以及API的使用- 数字摘要  SHA1 sha224 sha256 sha384 sha512等- 消息认证码 HMAC- TEE侧获取时间的函数有哪些(TEE_GetSystemTime、TEE_GetREETime),有什么区别?分别是怎样使用的? - 如何获取随机数(TEE_GenerateRandom)?- TA调用TA的示例和演示后续可能继续补充的如下(也欢迎大家提需求):- multi-session和multi-instance的使用- CA LOGIN flag的使用 

16,749

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧