Рассмотрим простой односвязный список в чисто функциональной обстановке. Его похвалы пели с горных вершин и будут продолжать петь. Здесь я расскажу об одной из его сильных сторон и о том, как ее можно распространить на более широкий класс чисто функциональных последовательностей, основанных на деревьях.
Проблема заключается в следующем: вы хотите проверить почти определенное структурное равенство за O (1) с помощью сильного хеширования. Если хеш-функция является структурно-рекурсивной, то есть hash (x: xs) = mix x (hash xs), тогда вы можете прозрачно кэшировать значения хеш-функции в списках и обновлять их в O (1) раз, когда элемент ограничен существующим списком. , Большинство алгоритмов хэширования списков структурно рекурсивны, поэтому этот подход в высшей степени применим на практике.
Но предположим, что вместо односвязных списков у вас есть древовидные последовательности, которые поддерживают конкатенацию двух последовательностей длины O (n) за O (log n) времени. Чтобы здесь работало кэширование хеша, функция смешивания хеша должна быть ассоциативной, чтобы уважать степени свободы дерева при представлении одной и той же линейной последовательности. Микшер должен взять хеш-значения поддеревьев и вычислить хеш-значение всего дерева.
Это было то место, где я был шесть месяцев назад, когда провел день, обдумывая и исследуя эту проблему. Кажется, в литературе не было уделено внимания структурам данных. Я сталкивался с алгоритмом хеширования Тиллиха-Земора из криптографии. Он основан на умножении матрицы 2x2 (которое является ассоциативным), где биты 0 и 1 соответствуют двум генераторам подалгебры с записями в поле Галуа.
У меня вопрос, что я пропустил? В литературе по криптографии и структурам данных должны быть статьи, которые мне не удалось найти в моем поиске. Будем весьма благодарны за любые комментарии по этой проблеме и возможные места для изучения.
Редактировать: меня интересует этот вопрос как на мягких, так и на криптографически сильных концах спектра. С другой стороны, его можно использовать для хеш-таблиц, где следует избегать коллизий, но они не являются катастрофическими. С другой стороны, его можно использовать для проверки на равенство.
Почти универсальное семейство хэш-функций
источник
источник