Генератор хеша eD2k на PHP

eDonkey2000, eDonkey, eD2k — файлообменная сеть, построенная по принципу P2P на основе сетевого протокола прикладного уровня MFTP. Сеть состоит из нескольких миллионов клиентов и нескольких десятков серверов, взаимодействующих между собой. Клиентами являются пользователи, загружающие файлы, и пользователи, имеющие полные версии файлов («полные источники»). Серверы позволяют находить опубликованные файлы и других пользователей, имеющих эти файлы (полностью или частично). Сами файлы через серверы не проходят.

Каждый клиент связан с одним из серверов сети. Клиент сообщает серверу, какие файлы он предоставляет в общий доступ. Каждый сервер поддерживает список всех общих файлов клиентов, подключенных к нему. Когда клиент что-то ищет, он посылает поисковый запрос своему основному серверу. В ответ сервер проверяет все файлы, которые ему известны, и возвращает клиенту список файлов, удовлетворяющих его запросу.

Возможен поиск по нескольким серверам сразу. Такие запросы и их результаты передаются через протокол UDP, чтобы уменьшить загрузку канала и количество подключений к серверам. Эта функция особенно полезна, если поиск на сервере, к которому клиент подключен в настоящее время, даёт низкий результат.

Кроме того, ссылки на файлы публикуются на различных форумах в Интернете, в виде так называемых «релизов».

Файлы в сети eDonkey идентифицируются благодаря использованию корневой MD4-хеш суммы MD4-сумм кусочков файла. Это позволяет считать одинаковыми файлы с разными названиями, но одинаковым содержимым, и различать файлы с разным содержимым, но одинаковым названием.
1. Файлы делятся на равные кусочки по 9,728,000 байт (9500 КБ) и остаток.
2. Для каждого кусочка вычисляется 128-битная MD4-хеш сумма.
3. Если размер файла кратен 9,728,000 байтам, то есть размер остатка равен 0, всё равно рассчитывается сумма для этого пустого остатка.
4. Затем все рассчитанные суммы объединяются в один единый массив (хеш-список) и рассчитывается MD4-хеш сумма всего этого массива. Эта сумма является корневой MD4-суммой — и идентификатором в сети eDonkey.
5. Если размер файла меньше 9,728,000 байт, то хеш-список не составляется, а идентификатором файла служит MD4-хеш сумма всего файла.

Используется для обмена файлами.

Пример:

ed2k://|file|[Имя файла]|[Размер файла]|[ ed2k хеш файла ]
|h=[ AICH хеш файла]|p=[ Md4 хеш 1ой части ]:[ Md4 хеш 2ой части ]:...
|s=[ URL ссылка на файл]|/|sources,[ IP адрес источника ]:[ Порт источника]|/

Чаще всего встречается короткий вид.

ed2k://|file|[Имя файла]|[Размер файла]|[ ed2k хеш файла ]|/

Имя файла рекомендуется URI кодировать.
Размер файла — точный размер в байтах.

h — AICH (Advanced Intelligent Corruption Handler)[править | править вики-текст]

Дополнительный хеш для ed2k ссылки. Использует более мелкие части для получения хеша. Это позволяет более подробно исследовать файл для нахождения и устранения ошибок, и уменьшает количество данных необходимых для восстановления файла.

Рекомендуется публиковать его в месте со ссылкой, тогда он сразу становится доверяемым хешем и сразу же может использоваться для восстановления файла. Если же его не публиковать вместе со ссылкой, то клиенту необходимо будет получить один и тот же AICH хеш из нескольких источников, прежде чем этот хеш будет признан достоверным.

Расчет AICH хеша

Для получения хеша стандартный ed2k чанк (9728000 байт) делится на 53 части (52x 180KB и 1x 140KB). Каждая часть позже обрабатывается алгоритмом sha1. Далее пары хешей снова проходят через алгоритм sha1 до тех пор, пока не получается один единственный хеш.

p — набор MD4 хешей

В этом поле перечисляются MD4 хеши ed2k чанков через двоеточие «:». Позволяет проверять части на соответствие даже если нет возможности получить набор хешей другим путём. Например, если единственным источником файла является URL ссылка.

s — URL ссылка

Позволяет при отсутствии ed2k источников загрузить файл по URL ссылке. Обычно сервера доступны постоянно в отличие от ed2k источников которыми в основном являются персональные компьютеры подключенные к сети интернет. Благодаря этому первичная загрузка происходит с сервера а дальнейшее распространение идет уже в сети ed2k что разгружает сервер и увеличивает доступность файла.

Перед вставкой ссылка должна быть URI кодирована.

sources — источники

Позволяет указать ed2k источники, к которым можно обратиться для загрузки файла. Это даёт возможность начать загрузку файла без подключения к ed2k серверу просто подключившись к перечисленным источникам напрямую.
Данное поле имеет смысл использовать только если источник имеет постоянный IP адрес.

Коллекции

Для публикации на порталах ссылки могут быть объединены в коллекции.

function ed2kHash_file ($name) {
	# Calculates eDonkey2000 hash for any given file
	# By: Tom Higginson
	# Date: 9th January 2008
	# Modified: 11th January 2010
	# License: Public domain

	$chunkSize = 9728000;
	$md4str = '';

	if( !file_exists( $name ) ) {
		return false;
	}

	if( filesize( $name ) < $chunkSize ) {
		return hash_file( 'md4', $name );
	} else {
		$fH = fopen( $name, 'r' );
		while( !feof( $fH ) ) {
			$md4str .= hash( 'md4', fread( $fH, $chunkSize ), true );
		}

		fclose( $fH );

		return hash( 'md4', $md4str );
	}
}


file.rar - путь к файлу какой надо захешировать.
0.0.0.0:80 - адрес и порт источника.

$fl = getcwd()."/file.rar";
echo "ed2k://|file|file.rar|".filesize($fl)."|".ed2kHash_file($fl)."|/|sources,0.0.0.0:80|/";



Просмотров: 1863
9.02.2015, 22:11 -

Категория: Статьи » Программирование » PHP