像 LimeWire 這樣的 P2P 程式會使用 sha1 來識別檔案。但它們以 base32 的方式進行。如果您想在 PHP5 中編寫 Gnutella 用戶端,以下是一個實用程式類別
/**
PHP5 的實用 base32 SHA1 類別
Copyright (C) 2006 Karl Magdsick (Python 的原始作者)
Angel Leon (移植到 PHP5)
Lime Wire LLC
這個程式是自由軟體;您可以重新發佈它和/或
依據 GNU 通用公共授權條款修改它
由自由軟體基金會發佈;可以是第 2 版
的授權,或(您可選擇)任何後續版本。
此程式的發佈希望它會有所幫助,
但不提供任何擔保;甚至不提供對於
適銷性或特定用途適用性的默示擔保。請參閱
GNU 通用公共授權以取得更多詳細資訊。
您應該已收到一份隨此程式一同提供的 GNU 通用公共授權副本;
如果沒有,請寫信給自由軟體
基金會,地址:51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA。
*/
class SHA1 {
static $BASE32_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';
/** 給定一個檔案,它會建立一個 magnetmix */
static function fileSHA1($file) {
$raw = sha1_file($file,true);
return SHA1::base32encode($raw);
} //fileSHA1
/** 採用原始輸入並將其轉換為 base32 */
static function base32encode($input) {
$output = '';
$position = 0;
$storedData = 0;
$storedBitCount = 0;
$index = 0;
while ($index < strlen($input)) {
$storedData <<= 8;
$storedData += ord($input[$index]);
$storedBitCount += 8;
$index += 1;
//盡可能從 storedData 中取出資料
while ($storedBitCount >= 5) {
$storedBitCount -= 5;
$output .= SHA1::$BASE32_ALPHABET[$storedData >> $storedBitCount];
$storedData &= ((1 << $storedBitCount) - 1);
}
} //while
//處理剩餘的資料
if ($storedBitCount > 0) {
$storedData <<= (5-$storedBitCount);
$output .= SHA1::$BASE32_ALPHABET[$storedData];
}
return $output;
} //base32encode
}