像 LimeWire 这样的 P2P 程序使用 sha1 来识别文件。但是它们以 base32 的方式进行。如果您想用 PHP5 编写 Gnutella 客户端,这里有一个实用程序类
/**
PHP5 的实用程序 base32 SHA1 类
版权所有 (C) 2006 Karl Magdsick(原始 Python 作者)
Angel Leon(移植到 PHP5)
Lime Wire LLC
此程序是免费软件;您可以重新分发和/或
根据自由软件基金会发布的 GNU 通用公共许可证修改它
作为许可证版本 2
或(根据您的选择)任何更高版本。
此程序分发是为了希望它有用,
但没有任何保证;甚至没有暗示的适销性或
适合特定用途的保证。有关更多详细信息,请参阅
GNU 通用公共许可证。
您应该已经收到了 GNU 通用公共许可证的副本
以及此程序;如果没有,请写信给自由软件
基金会,公司,51 Franklin Street,五楼,波士顿,马萨诸塞州 02110-1301,美国。
*/
类 SHA1 {
静态 $BASE32_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';
/** 给定一个文件,它会创建一个 magnetmix */
静态函数 fileSHA1($file) {
$raw = sha1_file($file,true);
return SHA1::base32encode($raw);
} //fileSHA1
/** 获取原始输入并将其转换为 base32 */
静态函数 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
}