Я использую ftok()
для генерации идентификаторов для сегментов разделяемой памяти, используемых приложением C. У меня возникли проблемы, когда в одном окне я получаю коллизии с идентификаторами, используемыми root. Я могу исправить это в этом случае, взломав код, но я бы хотел более надежное решение.
Приложение установлено в его собственный логический том, а путь, предоставленный ftok, является каталогом двоичных файлов приложения (в пределах этого lv). Предоставленные идентификаторы начинаются с 1, и обычно их около полдюжины.
Я обнаружил, что ftok будет делать что-то вроде этого:
(id & 0xff) << 24 | (st.st_dev & 0xff) << 16 | (st.st_ino & 0xffff)
Сочетание st.st_dev / st.st_ino должно быть очень уникальным. Но я видел через несколько блоков, младший значащий бит st_dev часто равен 0 (то есть числа st_dev обычно кратны 256). А поскольку двоичный каталог находится в логическом томе, нет никакой гарантии, что номер инода будет отличаться от того, что использует root.
Есть ли хороший способ обойти это - лучшую альтернативу ftok или способ настройки машин таким образом, чтобы числа st_dev были более полезны для ftok?