線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1527
推到 Plurk!
推到 Facebook!

密碼學-Hash

尚未結案
cyl
中階會員


發表:163
回覆:171
積分:66
註冊:2002-07-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-04-06 18:31:02 IP:210.64.xxx.xxx 未訂閱
請問我要對hash(a)之後的值運算 要如何做?因為使用MD5後的hash value是一個非常大的16進制數值 我要加上一個正整數,不知要如何寫?此hash value一直無法轉成10進制?? a=hash(p) b,要得知a值
chris_shieh
高階會員


發表:46
回覆:308
積分:240
註冊:2004-04-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-04-07 02:42:45 IP:218.167.xxx.xxx 未訂閱
請參考 "站長出個題目給大家寫寫:無限位數的加減乘除" http://delphi.ktop.com.tw/topic.php?topic_id=23866 @瞭解越多.懂得越少@
cyl
中階會員


發表:163
回覆:171
積分:66
註冊:2002-07-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-04-07 08:43:33 IP:210.64.xxx.xxx 未訂閱
引言: 請參考 "站長出個題目給大家寫寫:無限位數的加減乘除" http://delphi.ktop.com.tw/topic.php?topic_id=23866 @瞭解越多.懂得越少@
請問這個大的hash值要如何轉成10進制
chris_shieh
高階會員


發表:46
回覆:308
積分:240
註冊:2004-04-26

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-04-07 10:51:34 IP:219.68.xxx.xxx 未訂閱
參考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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-04-07 12:32:47 IP:202.181.xxx.xxx 未訂閱
可是要如何把這個很大的16進制轉成10進制呢
chris_shieh
高階會員


發表:46
回覆:308
積分:240
註冊:2004-04-26

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-04-07 15:02:23 IP:219.68.xxx.xxx 未訂閱
我已經把函式改成直接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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-04-07 22:45:03 IP:203.73.xxx.xxx 未訂閱
我知,可是最後結果是要以10進制表示,所以還是需要轉啊
chris_shieh
高階會員


發表:46
回覆:308
積分:240
註冊:2004-04-26

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-04-08 16:32:37 IP:219.68.xxx.xxx 未訂閱
既然是很大的值 我想還是要用到"無限位數的加減乘除"的函式    我想這問題應該要由過程來看 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    @瞭解越多.懂得越少@    發表人 - chris_shieh 於 2005/04/08  16:43:20
        
系統時間:2024-06-08 7:35:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!