2012-07-27 31 views
2

我有一個Base32信息哈希。例如​​,我需要將其轉換爲base16。如何從基地32位轉換信息哈希到基地16

我該怎麼用PHP做到這一點?

我的代碼如下所示:

$hash32=strtolower($hash32); 
echo $hash32; // shows - IXE2K3JMCPUZWTW3YQZZOIB5XD6KZIEQ 
$hash32=sha1($hash32); 
$hash16=base_convert($hash32, 32, 16); 
echo "</br>"; 
echo $hash16 // shows - 3ee5e7325a282c56fe2011125e0492f6ffbcd467 

在我的代碼基於16信息哈希無效..

有效信息散列45C9A56D2C13E99B4EDBC43397203DB8FCACA090

我怎樣才能得到一個有效的信息哈希?

感謝

+0

那麼,你爲什麼哈希呢? – 2012-07-27 06:03:38

+0

你是什麼意思的有效信息哈希? – varuog 2012-07-27 06:15:20

+0

Bittorrent的info_hash是sha1哈希,而不是base32。你確定你做了正確的轉換嗎? – Timur 2012-07-27 09:03:54

回答

4

我給你一個答案與自願省略gmp_strval(gmp_init(strtoupper($hash32), 32), 16);作品與GMP安裝在您的服務器。

function convBase($numberInput, $fromBaseInput, $toBaseInput) 
{ 
    if ($fromBaseInput==$toBaseInput) return $numberInput; 
    $fromBase = str_split($fromBaseInput,1); 
    $toBase = str_split($toBaseInput,1); 
    $number = str_split($numberInput,1); 
    $fromLen=strlen($fromBaseInput); 
    $toLen=strlen($toBaseInput); 
    $numberLen=strlen($numberInput); 
    $retval=''; 
    if ($toBaseInput == '') 
    { 
     $retval=0; 
     for ($i = 1;$i <= $numberLen; $i++) 
      $retval = bcadd($retval, bcmul(array_search($number[$i-1], $fromBase),bcpow($fromLen,$numberLen-$i))); 
     return $retval; 
    } 
    if ($fromBaseInput != '') 
     $base10=convBase($numberInput, $fromBaseInput, ''); 
    else 
     $base10 = $numberInput; 
    if ($base10<strlen($toBaseInput)) 
     return $toBase[$base10]; 
    while($base10 != '0') 
    { 
     $retval = $toBase[bcmod($base10,$toLen)].$retval; 
     $base10 = bcdiv($base10,$toLen,0); 
    } 
    return $retval; 
} 

此功能,發現here「從任何鹼的任何鹼轉換任意大量的」。 你只需要轉換從基地32基地16,因此:

base 32 alphabet是:ABCDEFGHIJKLMNOPQRSTUVWXYZ234567

$hash32='IXE2K3JMCPUZWTW3YQZZOIB5XD6KZIEQ'; 
$hash16=convBase($hash32, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567', 'ABCDEF'); 
//$hash16='45C9A56D2C13E99B4EDBC43397203DB8FCACA090' 

的這裏的問題是,base_convert誤操作大量涌現。

+0

謝謝羅曼,你做到了。 :) – miyuru 2012-07-27 10:45:36