информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Spanning Tree Protocol: недокументированное применениеСетевые кракеры и правда о деле ЛевинаСтрашный баг в Windows
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Re 18.01.06 01:41  Число просмотров: 2226
Автор: Heller <Heller> Статус: Elderman
Отредактировано 18.01.06 01:51  Количество правок: 1
<"чистая" ссылка>
> Всем привет
> Есть хеш, %file где ключем является имя файла, а значением:
> его контрольная сумма
> Как можно получить все имена файлов, у которых контрольная
> сумма совпадает?
Собственно встречный вопрос: если, допустим, хэш у нас такой:
f1 - A
f2 - B
f3 - C
f4 - A
f5 - B
(A, B, C - хэши, fN - файлы), то что мы должны получить на выходе:
a). массив "f1, f2, f4, f5"
б). два массива "f1, f4" и "f2 ,f5"

В общем случае делай так:
1. Создаешь массив
@keys=keys %filehashes
в нем будут лежать все имена файлов.

2.
@files=();
push @files, (pop @keys);
$hash=$filehashes{$files[0]};
delete ($filehashes{$files[0]});
for ($i=0;$i<=$#keys;$i++) {
if ($filehashes{$keys[$i]} eq $hash) {
push @files, $keys[$i];
delete ($filehashes{$keys[$i]} );
@keys=(@keys[0..($i-1)],@keys[($i+1)..$#keys]);
}
}
Такая процедура возмет первый файл из массива @keys и занесет в массив @files имена всех файлов с тем же самым хешем. При этом из изначального хеша и массива @keys все эти имена файлов будут удалены. Для удаления элемента из массива я использовал конструкцию
@keys=(@keys[0..($i-1)],@keys[($i+1)..$#keys])
это вообще не лучший вариант и это обычно делается по-другому, но я в данный момент не имею доступа к Perl'у и как это делается "правильно" запамятовал. Конечно, эту строчку лучше поправить.

3. В зависимости от того, что требуется. Если твой случай - это вариант а), то просто добавляй полученный массив@files к третьему массиву, который и будет результирующим. Если у тебя вариант б), то тебе потребуется "массив массивов". Добавлять массивы (вернее, ссылки на них) в массив массивов можно так:
push @array, [@files].
Здесь @array - массив массивов. Не уверен, что это сработает, так как Perl'а под рукой не имею, но скорее всего прокатит. В крайнем случае посмотри в Яндексе или доках - тут ничего сложного нет.

4. Все что уже написал оформляешь в цикле по всем элементам @keys.
<programming>
[Perl] Вопрос по хешам 17.01.06 21:25  
Автор: Cyber_Onix Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Всем привет
Есть хеш, %file где ключем является имя файла, а значением: его контрольная сумма
Как можно получить все имена файлов, у которых контрольная сумма совпадает?
можно поменять местами ключ и данные, т.е. проходя по всем... 18.01.06 13:13  
Автор: sprohorov Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Всем привет
> Есть хеш, %file где ключем является имя файла, а значением:
> его контрольная сумма
> Как можно получить все имена файлов, у которых контрольная
> сумма совпадает?

можно поменять местами ключ и данные, т.е. проходя по всем записям в %file сформировать %sum, в котором ключем является контрольная сумма а значением имя файла, дальше дело техники
Re 18.01.06 01:41  
Автор: Heller <Heller> Статус: Elderman
Отредактировано 18.01.06 01:51  Количество правок: 1
<"чистая" ссылка>
> Всем привет
> Есть хеш, %file где ключем является имя файла, а значением:
> его контрольная сумма
> Как можно получить все имена файлов, у которых контрольная
> сумма совпадает?
Собственно встречный вопрос: если, допустим, хэш у нас такой:
f1 - A
f2 - B
f3 - C
f4 - A
f5 - B
(A, B, C - хэши, fN - файлы), то что мы должны получить на выходе:
a). массив "f1, f2, f4, f5"
б). два массива "f1, f4" и "f2 ,f5"

В общем случае делай так:
1. Создаешь массив
@keys=keys %filehashes
в нем будут лежать все имена файлов.

2.
@files=();
push @files, (pop @keys);
$hash=$filehashes{$files[0]};
delete ($filehashes{$files[0]});
for ($i=0;$i<=$#keys;$i++) {
if ($filehashes{$keys[$i]} eq $hash) {
push @files, $keys[$i];
delete ($filehashes{$keys[$i]} );
@keys=(@keys[0..($i-1)],@keys[($i+1)..$#keys]);
}
}
Такая процедура возмет первый файл из массива @keys и занесет в массив @files имена всех файлов с тем же самым хешем. При этом из изначального хеша и массива @keys все эти имена файлов будут удалены. Для удаления элемента из массива я использовал конструкцию
@keys=(@keys[0..($i-1)],@keys[($i+1)..$#keys])
это вообще не лучший вариант и это обычно делается по-другому, но я в данный момент не имею доступа к Perl'у и как это делается "правильно" запамятовал. Конечно, эту строчку лучше поправить.

3. В зависимости от того, что требуется. Если твой случай - это вариант а), то просто добавляй полученный массив@files к третьему массиву, который и будет результирующим. Если у тебя вариант б), то тебе потребуется "массив массивов". Добавлять массивы (вернее, ссылки на них) в массив массивов можно так:
push @array, [@files].
Здесь @array - массив массивов. Не уверен, что это сработает, так как Perl'а под рукой не имею, но скорее всего прокатит. В крайнем случае посмотри в Яндексе или доках - тут ничего сложного нет.

4. Все что уже написал оформляешь в цикле по всем элементам @keys.
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach