function str2binl(str)
{
var bin = Array();
var mask = (1 << chrsz) - 1;
for (var i = 0; i < str.length * chrsz; i += chrsz)
bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << (i % 32);
return bin;
}看 不懂,有懂的大虾说下
{
var bin = Array();
var mask = (1 << chrsz) - 1;
for (var i = 0; i < str.length * chrsz; i += chrsz)
bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << (i % 32);
return bin;
}看 不懂,有懂的大虾说下
var
I: Integer;
chrsz: Byte;
mask: Byte;
begin
I := 0;
chrsz := 8;
SetLength(Result, Length(str) shr 5 + 1);
while i < Length(str) * chrsz do
begin
Result[i shr 5 + 1] := Chr(Ord(Result[i shr 5 + 1])
or ((Ord(str[i div chrsz + 1])) and mask) shl (i mod 32));
Inc(I, chrsz);
end;
end;
function md5(s) //32的一次MD5
{
return binl2hex(core_md5(str2binl(s), s.length * chrsz));
}function md5_3(s) //3次MD5
{
var tmp = new Array;
tmp = core_md5(str2binl(s), s.length * chrsz)
tmp = core_md5(tmp, 16 * chrsz);
tmp = core_md5(tmp, 16 * chrsz);
return binl2hex(tmp);
}
一次MD5可直接用delphi里MD532位加密就可以
但是MD53次,就不一样了.有没有办法实现直接跟md5_3(s),的3次MD5函数一样?
md5_3('123456')返回的是D93AE65992CAF6A8751E334D0A716AD8
var
I, ishr5: Integer;
chrsz: Byte;
mask: Byte;
res: TStringList;
begin
I := 0;
chrsz := 8;
res := TStringList.Create;
mask := (1 shl chrsz) - 1;
while i < Length(str) * chrsz do
begin
ishr5 := i shr 5;
if (ishr5 >= res.Count) then
begin
res.Add('');
end;
res[ishr5] :=
Format('%d', [StrToIntDef(res[ishr5], 0)
or (Ord(str[i div chrsz + 1]) and mask ) shl (i mod 32)]);
Inc(I, chrsz);
end;
Result := res.CommaText;
res.Free;
end;