面试官:讲讲雪花算法,越详细越好( 三 )


3. twepoch表示什么?由于时间戳只能用69年,我们的计时又是从1970年开始的,所以这个twepoch表示从项目开始的时间,用生成ID的时间减去twepoch作为时间戳,可以使用更久 。
4. -1L ^ (-1L << x) 表示什么?表示 x 位二进制可以表示多少个数值,假设x为3:
在计算机中,第一位是符号位,负数的反码是除了符号位,1变0,0变1, 而补码则是反码+1:
-1L 原码:1000 0001-1L 反码:1111 1110-1L 补码:1111 1111从上面的结果可以知道,-1L其实在二进制里面其实就是全部为1,那么 -1L 左移动 3位,其实得到 1111 1000,也就是最后3位是0,再与-1L异或计算之后,其实得到的,就是后面3位全是1 。-1L ^ (-1L << x) 表示的其实就是x位全是1的值,也就是x位的二进制能表示的最大数值 。
5.时间戳比较在获取时间戳小于上一次获取的时间戳的时候,不能生成ID,而是继续循环,直到生成可用的ID,这里没有使用拓展位防止时钟回拨 。
6.前端直接使用发生精度丢失如果前端直接使用服务端生成的long 类型 id,会发生精度丢失的问题,因为 JS 中Number是16位的(指的是十进制的数字),而雪花算法计算出来最长的数字是19位的,这个时候需要用 String 作为中间转换,输出到前端即可 。
秦怀の观点雪花算法其实是依赖于时间的一致性的,如果时间回拨,就可能有问题,一般使用拓展位解决 。而只能使用69年这个时间限制,其实可以根据自己的需要,把时间戳的位数设置得更多一点,比如42位可以用139年,但是很多公司首先得活下来 。当然雪花算法也不是银弹,它也有缺点,在单机上递增,而多台机器只是大致递增趋势,并不是严格递增的 。
没有最好的设计方案,只有合适和不合适的方案 。

原文:
https://www.cnblogs.com/Damaer/p/15559201.html

【面试官:讲讲雪花算法,越详细越好】


推荐阅读