3.4. Problems with Clocks and Serial Numbers (时钟和序列号的问题)
3.4. Problems with Clocks and Serial Numbers (时钟和序列号的问题)
计算机时钟和类似的操作系统或硬件值提供的真实不可预测性比特明显少于其规格所显示的。
已经在众多系统上对时钟进行了测试, 发现它们的行为可能会有很大差异并且以意想不到的方式变化。在一组硬件上运行的操作系统的一个版本可能实际上在时钟中提供微秒分辨率, 而"相同"系统的不同配置可能总是提供相同的低位比特, 并且仅以低得多的分辨率在高位比特中计数。这意味着即使已经经过了足够的时间使得值"应该"根据标称时钟分辨率改变, 时钟的连续读取也可能产生相同的值。还有一些情况, 频繁读取时钟可能会产生人为的顺序值, 因为有额外的代码检查时钟在两次读取之间是否未改变并将其增加1! 设计可移植的应用程序代码以基于这种系统时钟生成不可预测的数字特别具有挑战性, 因为系统设计者并不总是知道系统时钟的属性。
使用硬件序列号 (例如以太网MAC地址) 也可能提供比人们猜测的更少的唯一性比特。这些数量通常是高度结构化的, 子字段可能只有有限范围的可能值, 或者值可能很容易根据大致的制造日期或其他数据猜测。
例如, 制造计算机和以太网适配器的公司很可能至少在内部使用其自己的适配器, 这显著限制了内置地址的范围。
上述问题使得如果代码要在各种计算机平台和系统上移植, 则生成代码以生成不可预测的数量很困难。