python 如何生成这样一个列表,列表的元素值是唯一且递增的,用来做排序的权值

发布于 2022-09-06 19:26:55 字数 649 浏览 35 评论 0

需求大概是这样的,数据库的表ordering字段拿来做排序,希望ordering值都是递增的,而且唯一,排序就实现了,下次处理新的数据,被选中的新数据一定会排在最前面。所以需要python来生成这样一个列表。

我想到用时间戳来做这个值,那么查到数据后,把当前时间戳赋值给ordering,于是我在前端想对100条数据中的任意几条排序,只要在前端把想排序的加上序号,被选中的数据给到后端处理,把这些数据按序号排序后,ordering字段赋值时间戳。
本地测试是对的,但是在服务器上就不行了,服务器运行速度太快,导致序号1,2,3 都可能被赋值同一个时间戳,于是我又想了个办法,就是 ordering = timestamp - 序号 这样虽然不会出现ordering重复的情况了。

但是我觉得这个还是不严谨,因为在很极端的情况下是会出现重复的
比如当前时间戳是123456,此次需要计算的序号是1,2
ordering 是 123455, 123454
下一个时间戳是123457 排序序号是3,
ordering 是123454 出现重复了

所以,python能不能去生成一个列表,列表的元素值是唯一且递增的,总觉得这种需求应该是常见的吧?大家怎么解决这个问题的,我上述的方法可以用了,只是从理论上来看,是有缺陷的。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

拥抱影子 2022-09-13 19:26:55

给个思路参考一下.

ordering 字段类型设置成 bitint(8字节), 字段值由两部分组成, 各占 4 字节:

  1. 高4字节储存当前时间戳
  2. 低4字节储存当前序号

这样可达到唯一且递增的结果. 比如 A 时间点增加 3 个记录, 字段值如下

 | id | ordering |
   0    order_val(A, 1)
   1    order_val(A, 2)
   2    order_val(A, 3)

其中 order_val() 是这样的 python 函数

def order_val(timestamp, index):
    return ((timestamp & 0xffffffff) << 32) | (index & 0xffffffff)

A + T 时间点增加 2 个记录, 字段值如下

 | id | ordering |
   0    order_val(A, 1)
   1    order_val(A, 2)
   2    order_val(A, 3)
   3    order_val(A+T, 1)
   4    order_val(A+T, 2)

由于 A+T > A(T>0), 对任意序列 x,y, 都有 order_val(A+T,x) > order_val(A,y), 即使 y > x.

九八野马 2022-09-13 19:26:55

需求大概是这样的,数据库的表ordering字段拿来做排序,希望ordering值都是递增的,而且唯一,排序就实现了,下次处理新的数据,被选中的新数据一定会排在最前面。所以需要python来生成这样一个列表。

Python 无法简单地解决这个问题。因为操作数据库数据的机器,不止你一台。

数据库的 sequence 功能,可以产出你要的,唯一,递增的东西。https://www.postgresql.org/do...

意犹 2022-09-13 19:26:55

可以用数据库自增id排序
python的话

# 生成1 ~ 999的列表
range(1, 1000)
可遇━不可求 2022-09-13 19:26:55

自己总结一下:我提问的需求有点偏离,重定应该放在数据库排序权值的字段上,而不是让python生成这样一个列表。
python需要实现一个函数返回一个值,让这个值在这个数据库中是唯一且递增的。 数据库如果是运用在商品的场景,一个人只会对自己的商品进行操作,那么他的数据虽然和别人在一张表上,但是操作只是自己的,用时间戳+排序号组成新的值,这个值对于这个用户来说就是唯一且递增的,如果场景不是这样,我认为可以把id(用户字段id)加上,来实现对整个表是唯一且递增的。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文