Как скопировать hash resource

buu

Новичок
Как скопировать hash resource

Проблема в следующем:
нужно по частям хешировать файл, причем вычислять сначала hash первой части, потом первой + второй, потом первой + второй + третьей и т.д. Размер файла может быть большим, так что держать все это дело в памяти нельзя. Такой вариант :
PHP:
$ctx = hash_init($algo);
hash_update($ctx, $data[0]);
$hash[0] = hash_final($ctx);
hash_update($ctx, $data[1]);
$hash[1] = hash_final($ctx);
не пройдет, т.к. после hash_final $ctx удаляется и больше проапдейтить его нельзя.
PHP:
$ctx1 = $ctx;
тоже не прокатило, т.к. $ctx1 получилось ссылкой на $ctx.
PHP:
$ctx1 = clone $ctx;
- не пашет, т.к. $ctx это не объект а ресурс.
PHP:
$ctx1 = unserialize(serialize($ctx));
- результат 0 (ресурс не сериализируется)

Есть ли вообще какой-то способ скопировать $ctx? или может есть другой способ потокового хеширования?
 

Wicked

Новичок
Если для этого ресурса нету собственных средств копирования, то скопировать его нельзя. Стандартные средства пхп дял этого не подходят.

То, что final() убивает ресурс, тоже объяснимо, но странно, что до сих пор ни у кого не было прецедентов как у тебя.
 

tony2001

TeaM PHPClub
В общем, идея хорошая и такая функция действительно может быть полезна.
Я приготовил патч, hash_copy() (это предварительное имя) появится в PHP 5.3+.
 

Wicked

Новичок
tony2001
имхо более идеологически правильным был бы вариант не убивать ресурс при вызове hash_final(), а чтобы hash_final() просто возвращал подсчитанную (в read-only режиме) хэш-сумму. При этом сам ресурс продолжал бы существовать в неизменном виде.

Чтобы никому не испортить жизнь, можно
string hash_final ( resource context [, bool raw_output = false] )
переделать в
string hash_final ( resource context [, bool raw_output = false [, bool destroy_resource = true]] )
 

tony2001

TeaM PHPClub
>имхо более идеологически правильным был бы вариант не убивать ресурс при вызове hash_final()

посколько при этом меняется/финализируется сам контекст, то убивать ресурс при этом - достаточно логично.
 

Wicked

Новичок
посколько при этом меняется/финализируется сам контекст
Я о том и говорю... что считать hash разумнее без изменения/финализации контекста, тогда и убивать ресурс будет не обязательно.

Но by default, конечно, надо будет все равно его убивать. Чтобы не вмешиваться в работу уже существующих приложений.
 

phprus

Moderator
Команда форума
Wicked
Но by default, конечно, надо будет все равно его убивать. Чтобы не вмешиваться в работу уже существующих приложений.
А если даже его и не убивать, то как это может повлиять на работу уже существующих приложений? Сейчас веть все-равно нельзя использовать ресурс после hash_final (как я понял эта функция удаляет ресурс. или нет?). Или все-же как-то можно?
 
Сверху