XE8新带了一个单元文件:System.Hash,其实,实现了三个类,分别是:
THash
THashMD5
THashSHA1
原生实现对MD5及SHA1的支持!
以MD5为例,很容易取一个串的MD5值。
procedure TForm40.Button2Click(Sender: TObject);
var
md5:THashMD5;
begin
Label1.Text:=md5.GetHashString(edit1.Text);//生成32字符长度的MD5
//也可以这样:
md5:=THashMD5.Create;
md5.Update(edit1.Text);
Label1.Text:=md5.HashAsString;
end;
THashMD5是记录类型,所以不用释放建立的实例。
THashMD5同时还提供了HMAC支持:
Label1.Text:=md5.GetHMAC(Edit1.Text,'红鱼儿');//生成32字符长度的HMAC.
这不能不说是XE8的进步,复杂的MD5等算法,对于Delphi开发者也可以直接使用了,简单、方便!
后记:XE9增加了SHA2支持!
附:Hash 算法及其应用
---------------
什么是 Hash
Hash 的
THash
THashMD5
THashSHA1
原生实现对MD5及SHA1的支持!
以MD5为例,很容易取一个串的MD5值。
procedure TForm40.Button2Click(Sender: TObject);
var
md5:THashMD5;
begin
Label1.Text:=md5.GetHashString(edit1.Text);//生成32字符长度的MD5
//也可以这样:
md5:=THashMD5.Create;
md5.Update(edit1.Text);
Label1.Text:=md5.HashAsString;
end;
THashMD5是记录类型,所以不用释放建立的实例。
THashMD5同时还提供了HMAC支持:
Label1.Text:=md5.GetHMAC(Edit1.Text,'红鱼儿');//生成32字符长度的HMAC.
这不能不说是XE8的进步,复杂的MD5等算法,对于Delphi开发者也可以直接使用了,简单、方便!
后记:XE9增加了SHA2支持!
附:Hash 算法及其应用
---------------
什么是 Hash
Hash 的
将数字转换大写的函数,改自这里,原文在Delphi XE8下不能正常转换。
Function MoneyConvert(mmje:real): string;
const
s1: string = '零壹贰叁肆伍陆柒捌玖';
s2: string = '分角元拾佰仟万拾佰仟亿拾佰仟万';
Function StrTran(const S, s1, s2: string): string;
begin
Result := S.Replace(s1, s2, [rfReplaceAll]);
end;
var
S, dx: string;
i, Len: Integer;
begin
if mmje < 0 then
begin
dx := '负';
mmje := -mmje;
end;
S := Format('%.0f', [mmje * 100]);
Len := s.Length;
for i := 0 to Len-1 do
dx := dx + s1.Substring(Ord(s.Chars[i]) - Ord('0') , 1) +s2.substring(Len-i-1,1);
dx := StrTra
Function MoneyConvert(mmje:real): string;
const
s1: string = '零壹贰叁肆伍陆柒捌玖';
s2: string = '分角元拾佰仟万拾佰仟亿拾佰仟万';
Function StrTran(const S, s1, s2: string): string;
begin
Result := S.Replace(s1, s2, [rfReplaceAll]);
end;
var
S, dx: string;
i, Len: Integer;
begin
if mmje < 0 then
begin
dx := '负';
mmje := -mmje;
end;
S := Format('%.0f', [mmje * 100]);
Len := s.Length;
for i := 0 to Len-1 do
dx := dx + s1.Substring(Ord(s.Chars[i]) - Ord('0') , 1) +s2.substring(Len-i-1,1);
dx := StrTra
分类: DelphiXE8 |
在自定义的Record类型中,使用string,不小心会造成内存泄漏,用下面的写法,则不会,在Xe8下测试通过。
type
PMyRecord=^TMyRecord;
TMyRecord=record
i:Integer;
s:string;
end;
var
p:PMyRecord;
begin
p:=new(PMyRecord);//分配内存
p.i:=100;//这里我简写了,也可写成p^.i
p.s:='aaaaaa';
dispose(p);//释放内存,这里是重点,p已经是PMyRecord类型,所以不用转换,如果是一个无类型的指针,则要做类型转换,如dispose(PMyRecord(p));
end;
type
PMyRecord=^TMyRecord;
TMyRecord=record
i:Integer;
s:string;
end;
var
p:PMyRecord;
begin
p:=new(PMyRecord);//分配内存
p.i:=100;//这里我简写了,也可写成p^.i
p.s:='aaaaaa';
dispose(p);//释放内存,这里是重点,p已经是PMyRecord类型,所以不用转换,如果是一个无类型的指针,则要做类型转换,如dispose(PMyRecord(p));
end;