3.6 KiB
set:version
what is happening inside set:version
Зачем
set:version в alt-rpm позволяет сопоставлять Provides и Requires пакетов не обычным сравнением версий, а сравнением специальных set-строк зависимостей вида
libfoo.so.X = set:<encoded-set>
encoded-set формируется на основе символов, необходимых/предоставляемых пакетом. Данный механизм позволяет гарантировать (с точностью до коллизий хэша, об этом будет далее) наличие всех требуемых символов в библиотеке. Это исключает ситуации, при которых ">= версий" ломается при удалении символа из библиотеки, а также ситуаций совпадения SONAME библиотек с разным набором символов.
set-строки (являющиеся перекодированным списком символов) генерируются способом, который позволяет их сравнивать между собой на предмет включения одного множества символов в другой.
Реализация set.c
set.c предоставляет 5 "публичных" API для работы set:version
int rpmsetcmp(const char *set1, const char *set2);
struct set *set_new(void);
void set_add(struct set *set, const char *sym);
const char *set_fini(struct set *set, int bpp);
struct set *set_free(struct set *set);
rpmsetcmp()
Основная функция, сравнивающая строки и выдающая результат в зависимости от включения:
- 1: set1 > set2
- 0: set1 == set2
- -1: set1 < set2 (aka set1 \subset set2)
- -2: set1 != set2
- -3: set1 decoder error
- -4: set2 decoder error
на основе данной заметки, set1 лучше делать как Provides для лучшей производительности.
set_new()
Создаёт пустой объект struct set.
Внутри struct set — это временный контейнер для строк символов и их будущих hash-значений.
Из релизации:
internally struct set is just a bag of strings and their hash values.
set_add()
Добавляет строковый символ в set.
Использование:
set_add(s, "printf@@GLIBC_2.2.5");
set_add(s, "malloc@@GLIBC_2.2.5");
set_fini()
Финализирует множество и возвращает готовую set-version строку.
Внутри происходит основная работа:
- Jenkins hash
- обрезка до bpp бит
- сортировка
- delta кодирование
- golomb кодирование
- base62(64) кодирование
set_free()
Освобождает struct set и его внутренние строки.
set.c под капотом
hash
delta
golomb
base62
Комментарии
additional
коды от Арсения для наглядности происходящего
some funny msg's