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

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

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

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

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

阅读 6.2k
4 个回答

给个思路参考一下.

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.

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

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

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

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

# 生成1 ~ 999的列表
range(1, 1000)

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题