密碼學-Hash |
尚未結案
|
cyl
中階會員 發表:163 回覆:171 積分:66 註冊:2002-07-11 發送簡訊給我 |
|
chris_shieh
高階會員 發表:46 回覆:308 積分:240 註冊:2004-04-26 發送簡訊給我 |
|
cyl
中階會員 發表:163 回覆:171 積分:66 註冊:2002-07-11 發送簡訊給我 |
|
chris_shieh
高階會員 發表:46 回覆:308 積分:240 註冊:2004-04-26 發送簡訊給我 |
參考John的寫法 改成16進位的加法
function InfinitHexAdd(a,b:string):string; // 十六進位的字串型態數字a 加 b var i,j,Temp,Tempa,Tempb,TempSum,TempPlus,acount,bcount:Integer; begin Result:=''; acount:=Length(a); bcount:=Length(b); if(acount<=bcount) then j:=acount else j:=bcount; TempSum:=0; TempPlus:=0; for i:=0 to j-1 do begin Tempa:=StrToInt('$' Copy(a,Length(a)-i,1)); Tempb:=StrToInt('$' Copy(b,Length(b)-i,1)); TempSum:=(Tempa Tempb) mod 16; Result:=IntToHex(TempSum TempPlus,1) Result; TempPlus:=(Tempa Tempb) div 16; end; if(acount=bcount) then begin if(TempPlus>0) then Result:=IntToHex(TempPlus,1) Result; end else begin if(j=acount) then begin Result:=IntToHex(StrToInt('$' Copy(b,bcount-acount,1)) TempPlus, 1) Result; for i:=acount 1 to bcount-1 do begin Result:=Copy(b,bcount-i,1) Result; end end else begin Result:=IntToHex(StrToInt('$' Copy(a,acount-bcount,1)) TempPlus, 1) Result; for i:=bcount 1 to acount-1 do begin Result:=Copy(a,acount-i,1) Result; end end; end; end;@瞭解越多.懂得越少@ 發表人 - chris_shieh 於 2005/04/07 11:28:45 |
cyl
中階會員 發表:163 回覆:171 積分:66 註冊:2002-07-11 發送簡訊給我 |
|
chris_shieh
高階會員 發表:46 回覆:308 積分:240 註冊:2004-04-26 發送簡訊給我 |
我已經把函式改成直接16進位相加
所以你可以直接把hash值跟另外一個值(16進位)相加
不需要轉換為10進位
ex:
var b:WORD;//10進位正整數 sa, sb, sHash:String; begin sb:=IntToHex(b, Length(sHash)); sa:=InfinitHexAdd(sHash, sb); //sb 是16進位的string end;@瞭解越多.懂得越少@ 發表人 - chris_shieh 於 2005/04/07 15:10:37 |
cyl
中階會員 發表:163 回覆:171 積分:66 註冊:2002-07-11 發送簡訊給我 |
|
chris_shieh
高階會員 發表:46 回覆:308 積分:240 註冊:2004-04-26 發送簡訊給我 |
既然是很大的值
我想還是要用到"無限位數的加減乘除"的函式 我想這問題應該要由過程來看
16進位轉10進位方法
ex:
$00AF 轉10進位 = 15*IntPower(16,0) + 10*IntPower(16,1) + 0*IntPower(16,2) + 0*IntPower(16,3)
這裡會用到"無限位數的加法"
PS. IntPower(16,0) 表示16的0次方
但是因為 IntPower(16,n) 當n 太大時 一樣無法計算 , 所以IntPower(16,n)=16*16*16*.....(n個) 要用上"無限位數的乘法"
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Math; type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; Edit2: TEdit; Edit3: TEdit; Edit4: TEdit; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} function InfinitHexAdd(a,b:string):string; // 十六進位的字串型態數字a 加 b var i,j,Temp,Tempa,Tempb,TempSum,TempPlus,acount,bcount:Integer; begin Result:=''; acount:=Length(a); bcount:=Length(b); if(acount<=bcount) then j:=acount else j:=bcount; TempSum:=0; TempPlus:=0; for i:=0 to j-1 do begin Tempa:=StrToInt('$' Copy(a,Length(a)-i,1)); Tempb:=StrToInt('$' Copy(b,Length(b)-i,1)); TempSum:=(Tempa Tempb) mod 16; Result:=IntToHex(TempSum TempPlus,1) Result; TempPlus:=(Tempa Tempb) div 16; end; if(acount=bcount) then begin if(TempPlus>0) then Result:=IntToHex(TempPlus,1) Result; end else begin if(j=acount) then begin Result:=IntToHex(StrToInt('$' Copy(b,bcount-acount,1)) TempPlus, 1) Result; for i:=acount 1 to bcount-1 do begin Result:=Copy(b,bcount-i,1) Result; end end else begin Result:=IntToHex(StrToInt('$' Copy(a,acount-bcount,1)) TempPlus, 1) Result; for i:=bcount 1 to acount-1 do begin Result:=Copy(a,acount-i,1) Result; end end; end; end; function OPAdd(var s:string;id,value:integer):integer; var ss,sv:string; begin Result:=0; if id<=0 then begin sv:=inttostr(value); s:=sv s; Result:=length(sv); end else begin ss:=intTostr(ord(s[id])-48 value); if length(ss) > 1 then begin s[id]:=ss[2]; Result:=OPAdd(s, id-1, ord(ss[1])-48); end else s[id]:=ss[1]; end; end; function InfinitAdd(s1,s2:string):string; var i,n1,n2:integer; begin n1:=length(s1); n2:=length(s2); if n2 > n1 then Result:=InfinitAdd(s2,s1) else begin Result:=s1; for i:=1 to n2 do n1:=n1 OPadd(Result,n1-n2 i, ord(s2[i])-48); end; end; function InfinitMul(s1,s2:string):string; var i,j,n1,n2,n:integer; begin n1:=length(s1); n2:=length(s2); if n2 > n1 then Result:=InfinitMul(s2,s1) else begin n:=n1; Result:=StringofChar('0',n1); for i:=1 to n2 do for j:=n1 downto 1 do n:=n OPAdd(Result,n-n1-n2 i j,(ord(s2[i])-48) * (ord(s1[j])-48)); end; end; procedure TForm1.Button1Click(Sender: TObject); var i,j, iHash:integer; sHash, sSum, sPower:String; bNotZero:Boolean; begin Edit1.Text:=UpperCase(Edit1.Text); Edit2.Text:=UpperCase(Edit2.Text); Edit3.Text:=InfinitHexAdd(Edit1.Text, Edit2.Text); sHash:=Edit3.Text; For i := 1 to Length(sHash) do begin if not bNotZero and (sHash[i]='0') then continue; sPower:='1'; if (i |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |