Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сериализация массива (его хэш/контрольная сумма), получить уникальный "хэш" массива 
:(
    Опции темы
zokos
Дата 26.11.2010, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 26.11.2010

Репутация: нет
Всего: нет



Добрый день. 
Сам я пишу на php, но возникла необходимость переделать одну функцию.
Сама задача (в кратце): есть поиск в магазине. Сначала показываются категории с количеством продуктов в каждой. Задача: не показывать те категории, в которых находятся одинаковые продукты. У каждого продукта есть свой ID.

Задумка такая была: для каждой категории получать "контрольную сумму/хэш/crc/md5", которую потом засовывать в простой массив. 
Для следующей категории делать тоже самое и затем смотреть в массиве, есть ли такая "контрольная сумма/хэш/crc/md5". Если есть - категории одинаковые.
Собственно, если бы я знал, как сравнивать массивы, можно было бы обойтись и без этого гемо всего. 

Итак вопрос: на входе есть массив, как получить его контрольную сумму.
Насколько я знаю, в перле название "хэш" - это не то, что нужно мне (это вроде массив с ключами ). 
Мне нужна... эммм... контрольная сумма массива, т.е. уникальный идентификатор. Что-то наподобие сериализированного массива.

Уф, надеюсь объяснил, что хоть кто-то мог понять.


Заранее спасибо.
PM MAIL   Вверх
arto
Дата 26.11.2010, 02:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



# perl -MDigest::MD5=md5_hex -le 'print md5_hex (join "|",@ARGV)' 1 2 3 4 5
19a493ad2f674b646bcecec77644f33d
#
PM MAIL ICQ   Вверх
zokos
Дата 26.11.2010, 03:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 26.11.2010

Репутация: нет
Всего: нет



Большое спасибо. Попробую и отпишусь.
PM MAIL   Вверх
gcc
Дата 26.11.2010, 06:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: 1
Всего: 17



вот так вот еще видел, хеш-ключ для nginx с уникальными $file->{srv_id},  $file->{file_id} и т.д.

Код

   require HCE_MD5;
   my $hce = HCE_MD5->new($c->{dl_key},"XFile");
   my $usr_id = $ses->getUser ? $ses->getUserId : 0;
   my $dx = sprintf("%d",($file->{file_real_id}||$file->{file_id})/$c->{files_per_folder});
   my $hash = &encode32( $hce->hce_block_encrypt(pack("HO7NN5JJK78",
                                                       $file->{srv_id},
                                                       $file->{file_id},
                                                       $usr_id,
                                                       $dx,
                                                       $file->{file_real},
                                                       $mode||'f',
                                                       split(/\./,$ses->getIP),
                                                       time+60*$mins)) );


sub encode32
{            
    $_=shift;
    my($l,$e);
    $_=unpack('B*',$_);
    s/(.....)/000$1/g;
    $l=length;
    if($l & 7)
    {
     $e=substr($_,$l & ~7);
     $_=substr($_,0,$l & ~7);
     $_.="000$e" . '0' x (5-length $e);
    }
    $_=pack('B*', $_);
    tr|\0-\37|A-Z2-7|;
    lc($_);
}




Это сообщение отредактировал(а) gcc - 26.11.2010, 07:00
PM WWW ICQ Skype GTalk Jabber   Вверх
Pfailed
Дата 26.11.2010, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 22
Всего: 39



Цитата(zokos @  26.11.2010,  01:01 Найти цитируемый пост)
Собственно, если бы я знал, как сравнивать массивы, можно было бы обойтись и без этого гемо всего. 


Код

use List::MoreUtils 'uniq';

my @a = (1,2,3);
my @b = (3,2,1);

if(uniq(@a, @b) == @a) {
    warn '@a == @b';
}



--------------------
PM MAIL   Вверх
arto
Дата 28.11.2010, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



# perl -MBenchmark=timethese -MList::MoreUtils=uniq -MDigest::MD5=md5_hex -e '@a = map { rand(100) } 1..100; @b = map { rand(100) } 1..100; timethese ($ARGV[0],{ "a" => sub { md5_hex (join "",@a) cmp md5_hex (join "",@b) },"b" => sub { uniq (@a,@b) == @a } } )' 100000
Benchmark: timing 100000 iterations of a, b...
         a:  3 wallclock secs ( 2.69 usr +  0.00 sys =  2.69 CPU) @ 37174.72/s (n=100000)
         b: 29 wallclock secs (17.69 usr +  0.04 sys = 17.73 CPU) @ 5640.16/s (n=100000)
#

PM MAIL ICQ   Вверх
Pfailed
Дата 30.11.2010, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 22
Всего: 39



arto,  ваш способ с контрольной суммой сообщит, что (1,2,3) != (3,2,1) 


--------------------
PM MAIL   Вверх
arto
Дата 30.11.2010, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1495
Регистрация: 31.10.2004

Репутация: 38
Всего: 40



1. этого не было в условии.
2. данные сразу можно держать сортированными.
PM MAIL ICQ   Вверх
zokos
Дата 2.12.2010, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 26.11.2010

Репутация: нет
Всего: нет



Большое спасибо всем!!
В идеале (1,2,3) должно быть равно (3,2,1), но надеюсь, что отсортировать массив я смогу smile
PM MAIL   Вверх
ming
Дата 4.12.2010, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 30.1.2009
Где: Новосибирск

Репутация: 2
Всего: 3



если версия перл 5.10 и выше, то можно так
Код

@a = sort @a;
@b = sort @b;
my $is_equal = @a ~~ @b;


Это сообщение отредактировал(а) ming - 4.12.2010, 10:27
PM MAIL ICQ Jabber   Вверх
KSURi
Дата 4.12.2010, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



Нельзя так. Читайте доку по смартматчингу.


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0566 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.