moon icon indicating copy to clipboard operation
moon copied to clipboard

uuid库,会生成重复的id

Open lonag opened this issue 1 year ago • 27 comments

uuid库,会生成重复的id uuid.next 是我理解错误吗?

lonag avatar Jul 31 '24 13:07 lonag

uuid库,会生成重复的id

uuid.next

是我理解错误吗?

有使用的代码吗?

sniper00 avatar Jul 31 '24 14:07 sniper00

就是demo那么用的,uid = uuid.next()

lonag avatar Aug 01 '24 01:08 lonag

隔了几个月,生成了一个重复的,登录串号了。

lonag avatar Aug 01 '24 01:08 lonag

不重复是由服务器启动次数+服务器Id保证的,其中启动次数支持1024次,一周启动一次,能支持20年。服务器id最大支持到4096。单次运行时间单服支持26万玩家注册。你看看这些值有没有溢出。

sniper00 avatar Aug 01 '24 02:08 sniper00

懂了。

lonag avatar Aug 01 '24 04:08 lonag

启动次数,没让加了,好像256就启动不了

lonag avatar Aug 01 '24 04:08 lonag

说错,不是256,估计时本地测试,达到1024次,我重置了,次数,可能是这个问题。

lonag avatar Aug 01 '24 04:08 lonag

建议启动次数,可以增加一点,本地测试,很快就达到了

lonag avatar Aug 01 '24 04:08 lonag

这个范围,你可以调整下,适合自己的游戏。后期我准备加个检测,保存并检查两次重启间剩余的递增序列百分比,例如大于80%,时可以利用上次的递增序列,且不增加重启次数

sniper00 avatar Aug 01 '24 04:08 sniper00

哪里可以改下这个1024,我想改大一点

lonag avatar Aug 01 '24 05:08 lonag

哪里可以改下这个1024,我想改大一点 这两处,但非uid类的 64bit已经占满了,你估计需要调整下其它的bit https://github.com/sniper00/moon/blob/master/lualib-src/lua_uuid.cpp#L15 https://github.com/sniper00/moon/blob/master/lualib-src/lua_uuid.cpp#L31

sniper00 avatar Aug 01 '24 06:08 sniper00

两处改成12,不会有其它问题不,先用用。

lonag avatar Aug 01 '24 08:08 lonag

先用

嗯,你可以把这两个改成12,server_bit 改成 10. 不过你之前生成的id会作废

sniper00 avatar Aug 01 '24 08:08 sniper00

改了,之后,会生成跟以前一样的uuid吗?是这个意思?

lonag avatar Aug 03 '24 00:08 lonag

有办法不影响老数据吗?

lonag avatar Aug 03 '24 00:08 lonag

你是测试环境,还是线上环境?

sniper00 avatar Aug 03 '24 00:08 sniper00

上线了

lonag avatar Aug 03 '24 04:08 lonag

测试环境,倒是无所谓。

lonag avatar Aug 03 '24 04:08 lonag

测试环境,倒是无所谓。

如果是玩家uid倒是有办法处理下,其它的 唯一id 就麻烦了

sniper00 avatar Aug 03 '24 04:08 sniper00

上线了

线上现在重启次数是多少?

sniper00 avatar Aug 03 '24 04:08 sniper00

500多,没注意

lonag avatar Aug 03 '24 05:08 lonag

500多,没注意

可以看下DB 里面具体情况

sniper00 avatar Aug 03 '24 05:08 sniper00

431次

lonag avatar Aug 03 '24 05:08 lonag

上线,没注意,直接导入的本地数据。

lonag avatar Aug 03 '24 05:08 lonag

上线,没注意,直接导入的本地数据。

https://github.com/sniper00/moon/commit/9ef269b272be143dfac760b24a917a085f6d37b5 试试这个修改。

local uuid = require "uuid"

uuid.init(1,1,1,{})

print(uuid.next(0))
print(uuid.next(0))
print(uuid.next(0))

for i=1,100000 do -- 把这个值修改为10000,然后看看 max_percent 的值
    uuid.next(0)
end

---服务器正常关闭时把这3个值存库, dump_sequence 为一个table 可以用json存储
local dump_sequence, max_percent, boottimes = uuid.dump()

-- 服务器启动时读取这两个值,并和boottime判断是否需要重用
print("max_percent", max_percent)
if max_percent < 0.3 then -- 30% 以下重用
    print("resue boottimes")
    uuid.init(1,1,boottimes,dump_sequence)
    print(uuid.next(0))
else
    print("add boottimes")
    uuid.init(1,1,boottimes+1,{})
    print(uuid.next(0))
end

sniper00 avatar Aug 03 '24 06:08 sniper00

你们一周维护一次线上的话,不修改还能坚持10年

sniper00 avatar Aug 03 '24 12:08 sniper00

嗯,我看看,感谢。

lonag avatar Aug 03 '24 14:08 lonag