Оттенки, на которые должен ответить сам автор.Разве StackOverflow не велик: -?
Смысл хеш-функций в том, что вы выбираете, не имеет значения, если он равномерно распределяет входные значения по большому количеству сегментов.Вам нужна хеш-функция, которую можно применить ко всему дереву;обычная техника для этого состоит в том, чтобы сериализовать дерево любым возможным способом (скажем, путем посещения дерева по порядку), а затем применить хеш-функцию к потоку значений (узлам дерева), которые это производит.(Эта идея взята из литературы по компилятору об обнаружении общих подвыражений, которая послужила источником вдохновения для оригинального CloneDR).Если это неясно, вам нужно потратить больше энергии на понимание того, как хэш-функции применяются к сложным структурам данных.Википедия о хэшировании - хорошее место для начала;если этого недостаточно, вам нужно найти книгу по алгоритмам и изучить ее.
Что вы передадите хэш-функции, решать только вам.Идея, которую я сделал в этой статье, заключается в том, что вы можете вычислить хеш-функции, которые игнорируют идентификаторы AST, что приведет к тому, что деревья, имеющие одинаковую структуру, но разные идентификаторы, будут хешироваться в одном и том же сегменте.Таким образом, деревья, которые являются похожими по модулю идентификаторами, легко сопоставляются, поскольку они встречаются в одном и том же контейнере хеша.
Конечно, в алгоритме обнаружения всего клона гораздо больше, чем просто сопоставление деревьев по модулю идентификаторов.Вам нужно беспокоиться о сопоставлении параметризованных последовательностей (что является важным моментом в статье), сообщать о результатах и, конечно, вам нужен высококачественный синтаксический анализатор языка для любого языка, который вам нужен, чтобы применить эток.
Вы можете увидеть результаты CloneDR для ряда различных языков.