«Хеш-дерево» — это концепция, аналогичная хэш-дереву Меркла/тигровому дереву, используемому Amazon Glacier для проверки целостности данных в подмножествах заданного потока данных.
Чтобы получать хэши дерева от Amazon Glacier при извлечении данных, указанный диапазон байтов должен быть «выровнен по хэшу дерева».
Концепция "выровненного хэша дерева" описана здесь.< /а>
Цитата из документации разработчика:
Диапазон [A, B] выровнен по хэшу дерева относительно архива тогда и только тогда, когда при построении нового хэша дерева поверх [A, B] корень хэша дерева этого диапазона эквивалентен узлу в хэш дерева всего архива. [...]
Рассмотрим [P, Q) как запрос диапазона для архива размером N мегабайт (МБ), а P и Q кратны одному МБ. Обратите внимание, что действительный инклюзивный диапазон равен [P МБ, Q МБ — 1 байт], но для простоты мы показываем его как [P, Q). С учетом этих соображений, то
- Если P — нечетное число, существует только один возможный диапазон, выровненный по хэшу дерева, то есть [P, P + 1 МБ).
- If P is an even number and k is the maximum number, where P can be written as 2k * X, then there are at most k tree-hash aligned ranges that start with P. X is an integer greater than 0. The tree-hash aligned ranges fall in the following categories:
- For each i, where (0 <= i <= k) and where P + 2i < N, then [P, Q + 2i) is a tree-hash aligned range.
- P = 0 — это особый случай, когда A = 2[lgN]*0
Теперь вопрос: как программно проверить, выровнен ли заданный диапазон [startByte, endByte] по дереву? Язык программирования значения не имеет.
Тестовые примеры:
[0,0) => true
[0,1) => true
[0,2) => false
[0,3) => true
[1,2) => false
[4,5) => true