У меня есть древовидная структура, где каждый узел знает свой CRC. Какой разумный способ вычислить CRC для каждого поддерева, что даст мне хорошее значение для всего поддерева к этому моменту? Другими словами, значение, определяющее, была ли изменена какая-либо часть поддерева.Как получить разумный CRC CRC
Моя текущая мысль - просто взять каждый дочерний узел CRC, преобразовать его в строку/байт [], объединить все узлы вместе и взять CRC этого байта []. Но я не уверен, что это может привести к легким столкновениям, поскольку я подозреваю, что это удаляет довольно много информации.
(я смотрел на crc32_combine, но это кажется неуместным, потому что у меня нет каких-либо длины. Я мог бы использовать нулевую длину, но это будет лучше или хуже?)
Работа в C#, но я предположим, это действительно язык агностик.
EDIT: Закончен с использованием этой техники. Будет переключиться на более длинные хэши, если столкновения, похоже, будут проблемой. Хотя мне не нужен порядок листьев, чтобы быть важным, я не использую xor на всякий случай, если это произойдет позже.
Ну, до тех пор, пока вы понимаете, что другой CRC означает, что произошли изменения (конечно), но что никакая разница не обязательно означает, что не было никаких изменений, я думаю, вы, вероятно, можете уйти с xor'ing значениями - возможно, с небольшим вращением, заброшенным для каждого значения. –
Озабоченность, что у меня возникла бы с XORing хешей, заключается в том, что она не учитывает позицию.Поэтому, если узел перемещается внутри поддерева, это поддерево будет по-прежнему иметь тот же хеш. –
@KingIsaac: Правильно - отсюда моя спекуляция по линиям вращения каждого значения до xor - это может быть основано на его горизонтальном смещении. –