Как я могу создать повторяющуюся подпись структуры данных?

У меня есть ситуация, когда я хочу создать подпись структуры данных:

my $signature = ds_to_sig(
  { foo   => 'bar',
    baz   => 'bundy',
    boing => undef,
    number => 1_234_567,
  }
);

Цель должна состоять в том, что если структура данных изменится, то должна измениться и подпись.

Есть ли установленный способ сделать это?


person EvdB    schedule 20.10.2008    source источник


Ответы (5)



Я думаю, что вы ищете хеш-функцию. Я бы рекомендовал такой подход:

use Storable;
$Storable::canonical = 1;
sub ds_to_sig {
    my $structure = shift;
    return hash(freeze $structure);
}

Хэшем функции может быть любая хэш-функция, например функция md5 из Digest:: MD5

person Leon Timmermans    schedule 20.10.2008
comment
Хе-хе. два практически идентичных ответа менее чем за 2 минуты. - person Rik; 20.10.2008
comment
Сделайте это 3 за 3 минуты! Я думаю, это может означать только то, что мы все сделали правильно ;-) - person Leon Timmermans; 20.10.2008
comment
Ключ там $Storable::canonical. Без этого Storeable не гарантирует порядок элементов. - person brian d foy; 20.10.2008
comment
Вероятно, вам следует использовать «nfreeze» для согласованности между платформами. - person EvdB; 20.10.2008

Используйте Storable::nstore, чтобы преобразовать его в двоичное представление, а затем вычислить контрольную сумму (для пример с модулем Digest).

Оба модуля являются базовыми.

person moritz    schedule 20.10.2008
comment
Я только что отредактировал свой код, чтобы сделать именно это. Мы с тобой снова на одной дорожке! - person Leon Timmermans; 20.10.2008

Думаю, вам нужно слово "хеширование".

По сути, вы пропускаете свою структуру данных через функцию, которая генерирует из нее довольно уникальное значение. Это значение будет вашей подписью.

person Rik    schedule 20.10.2008

Разве вы не можете использовать объект вместо структуры? Таким образом, вы могли бы видеть, является ли объект экземпляром типа, без необходимости сравнивать хэши и т.д.

person Demian Turner    schedule 20.10.2008
comment
структуры данных и объекты в Perl 5 в значительной степени взаимозаменяемы — объекты на самом деле являются просто благословенными ссылками на данные. В любом случае - я хочу получить подпись содержимого данных - person EvdB; 20.10.2008
comment
Настоящая проблема с этим подходом в том, что ему нужны данные. Поскольку данные используются для поддержания состояния объектов, вам придется создавать экземпляр нового объекта каждый раз, когда состояние изменяется, что отрицает этот подход. - person Ovid; 21.10.2008