在设计 API 时,出于安全性等因素考虑,有时需要放弃使用自增 ID,使 ID 非连续且不可猜测。通常可以使用 Hash id,UUID,雪花 ID 等来实现。
在最近的一个项目中,我尝试使用雪花 ID。一通折腾下来发现,逼格挺高,实现也挺简单。然而当我继续撸起袖子与前端部分对接时,却出现了 JS 精度丢失问题,因为存储的 ID 是一个 unsigned bigint 型的值。(至于为什么会有精度丢失现象,这里就不具体解释了,不清楚的可以自行搜索),本文主要介绍解决办法。
想要解决这问题,基本原
在 Python 整型对象所存储的位置是不同的, 有一些是一直存储在某个存储里面, 而其它的, 则在使用时开辟出空间.
说这句话的理由, 可以看看如下代码:
a = 5
b = 5
a is b # True
a = 500
b = 500
a is b # False
由上面的代码可知, 整型 5 是一直存在的, 而整型 500 不是一直存在的.
那么有哪些整数是一直存储的呢?
a, b, c = 0, 0, 0
while a is b:
i += 1
a, b = int(str(i)
本次分析基于 CPython 解释器,python3.x版本
在python2时代,整型有 int 类型和 long 长整型,长整型不存在溢出问题,即可以存放任意大小的整数。在python3后,统一使用了长整型。这也是吸引科研人员的一部分了,适合大数据运算,不会溢出,也不会有其他语言那样还分短整型,整型,长整型…因此python就降低其他行业的学习门槛了。
那么,不溢出的整型实现上是否可行呢?
不溢出的整型的可行性
尽管在 C 语言中,整型所表示的大小是有范围的,但是 python 代码是保存
在 Python 整型对象所存储的位置是不同的, 有一些是一直存储在某个存储里面, 而其它的, 则在使用时开辟出空间.
说这句话的理由, 可以看看如下代码:
a = 5
b = 5
a is b # True
a = 500
b = 500
a is b # False
由上面的代码可知, 整型 5 是一直存在的, 而整型 500 不是一直存在的.
那么有哪些整数是一直存储的呢?
a, b, c = 0, 0, 0
while a is b:
i += 1
a, b = int(str(i