深入解析雪花算法:为什么要减去起始时间?
要减去一个起始时间呢?
对于雪花算法,使用当前时间戳减去一个起始时间是为了保证生成的 ID 具有单调递增的特性,并且可以避免时钟回拨的问题。
因为雪花算法的 ID 是由时间戳、机器 ID、序列号等组成的,其中时间戳占据了 41 位,可以表示的时间范围是 69 年,而序列号只有 12 位,机器 ID 只有 10 位,所以时间戳是 ID 生成的主要依据。
如果直接使用时间戳,可能会出现以下问题:
- 由于时间戳只有毫秒级别的精度,可能会出现两个不同的 ID 在同一毫秒内生成的情况,这样就无法保证 ID 的单调递增性。
- 如果时钟回拨,可能会导致生成的 ID 不唯一,甚至会出现 ID 倒退的情况。
为了避免这些问题,一般会在启动时记录一个起始时间,并将当前时间戳减去起始时间得到一个相对时间戳,然后将相对时间戳和机器 ID、序列号等组合生成 ID。这样可以保证生成的 ID 具有单调递增的特性,并且不会出现时钟回拨导致的问题。
当然,多台机器相同的时间戳减去相同的起始时间会重复这个问题也是存在的,但是在实际应用中,这个概率非常小,并且可以通过增加机器 ID 和序列号的位数来进一步降低重复的概率。
原文地址: https://www.cveoy.top/t/topic/mH1H 著作权归作者所有。请勿转载和采集!