ftok() collisions

Я использую ftok() для генерации идентификаторов сегментов общей памяти, используемых приложением на языке Си. У меня есть проблемы, где на одном блоке я получаю коллизии с идентификаторами, используемыми корнем. В данном случае я могу исправить это, взломав код, но мне бы хотелось более надежное решение.

Приложение устанавливается в свой логический том, а путь, ведущий к 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). А поскольку бинарный каталог находится в логическом томе, то нет никакой гарантии, что номер inode будет отличаться от того, что использует корень.

Есть ли хороший способ обойти это - лучшая альтернатива ftok, или способ настройки машин так, чтобы числа st_dev были более полезны для ftok?

8
задан alk 6 April 2013 в 10:04
поделиться