golang 中使用时间戳作为用户 id 的可行性

更新日期: 2020-09-30 阅读次数: 180 字数: 369 分类: golang

有一个简单的使用场景,即用户在一个设备上,会反复添加条目,例如一个 TODO 项。除了自增 ID 之外,我还想加上另外一个唯一标识。由于同一时间,用户只能添加一条记录,所以不会出现并发冲突的问题。

能想到的最简单方案就是使用时间戳。于是调研了一下可行性。

golang int 的值范围

  • int32: -2147483648 到 2147483647。大概 21 亿
  • int64: -9223372036854775808 到 9223372036854775807

以秒为单位的时间戳的数值大小

但是用时间戳,会遇到 2038 问题,即 2038 后,时间戳会超出 int32 的存储范围。虽然距离 2038 年还很遥远。。。但是我觉得还是严谨一点比较好。

The Year 2038 problem (also called Y2038 or Y2k38 or Unix Y2K) relates to representing time in many digital systems as the number of seconds passed since 00:00:00 UTC on 1 January 1970 and storing it as a signed 32-bit integer. Such implementations cannot encode times after 03:14:07 UTC on 19 January 2038. Similar to the Y2K problem, the Year 2038 problem is caused by insufficient capacity used to represent time.The latest time since 1 January 1970 that can be stored using a signed 32-bit integer is 03:14:07 on Tuesday, 19 January 2038 (231-1 = 2,147,483,647 seconds after 1 January 1970).

package main

import (
	"fmt"
	"time"
)

func main() {
	t := int32(time.Now().Unix())
	fmt.Println(t)
}

> 1257894000

不如用 datetime 的可读格式 200816220256精确到秒,这样可读性好,且不容易重复。不行,超了 Int32 的范围。

结论

哎,还是用自增 id 吧,从 -1 开始加到 -N 吧。

领取阿里云/腾讯云服务器优惠券

关于作者

我是来自山东烟台的一名开发者,喜欢瞎折腾,顺便记记笔记。有敢兴趣的话题,欢迎加微信 zhongwei 聊聊, 查看更多联系方式。 白天写程序,晚上哄熊孩子,可能回复有点慢,见谅。同时也欢迎关注我的微信公众号“大象工具”: 大象工具微信公众号

tags: 时间戳 2038 问题

相关文章

谈笑风生

solos

snowflake不香么

爱评论不评论

近期节日

2020年10月31日 世界勤俭日
2020年11月01日 万圣节
2020年11月07日 立冬
2020年11月08日 中国记者日
2020年11月10日 世界青年节
2020年11月11日 光棍节
2020年11月14日 世界糖尿病日
2020年11月17日 国际大学生节
2020年11月20日 国际儿童日
2020年11月21日 世界问候日
2020年11月22日 小雪
2020年11月26日 感恩节
查看更多节日