ftok()碰撞

我正在使用ftok()为C应用程序使用的共享内存段生成标识符。 我遇到了问题,在一个盒子里,我碰到了root使用的标识符。 我可以在这个例子中通过黑客代码修复它,但我想要一个更强大的解决scheme。

应用程序被安装到自己的逻辑卷中,并且提供给ftok的path是应用程序的二进制目录(在该lv内)。 所提供的ID从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号码与root用途不同。

有没有一个很好的解决方法 – 一个更好的替代ftok,或者设置机器的方式,使st_dev数字将更有用的ftok?

Solutions Collecting From Web of "ftok()碰撞"

您可能需要考虑使用POSIX共享内存(通过shm_open ),这种内存不会遇到这种冲突

您的应用程序应始终能够处理关键冲突。 一个关键可能被另一个不相关的进程使用。 但是你可以尝试使用更多相关的位来创建你自己的ftok()版本。

理论上任何应用程序只需要一个“主”键,指向一个“记分牌”,其中可以找到其他键。 在文件系统上公开masterkey可能是个好主意。 崩溃后重新启动将永远是个问题。