gpt4 book ai didi

erlang - erlang refs 在节点/VM 重启之间是唯一的吗?

转载 作者:行者123 更新时间:2023-12-04 13:53:21 26 4
gpt4 key购买 nike

文档说

make_ref() -> ref()  

Returns an almost unique reference.

The returned reference will re-occur after approximately 282 calls; therefore it is unique enough for practical purposes.



但是我的眼睛告诉我,在 VM 重新启动之间,我可以轻松获得相同的引用:
[~] erl
Erlang R14B04 (erts-5.8.5)
1> make_ref().
#Ref<0.0.0.33>
2> make_ref().
#Ref<0.0.0.37>
^C

[~] erl
Erlang R14B04 (erts-5.8.5)
1> make_ref().
#Ref<0.0.0.33>

那么,Erlang 的 Refs 有多独特?当标签在 mq 或 db 中持久化并且可能由不同的 VM session 生成时,它们是否适合用作唯一的“标签”生成器。

我知道 UUID 可以用于此目的。众所周知,pids() 是可重复、可重用的,如果序列化然后从持久存储中加载,则绝不是唯一的。

问题是,refs() 是什么——更像 UUID 还是更像 pids()? refs() 在节点之间是唯一的吗?重启之间?有没有关于这个主题的官方信息?

最佳答案

与节点名称相关的引用并不意味着随机性,只是唯一性。
正如您已经注意到的,它们是以循环方式创建的。
此外,您对引用仅在节点的生命周期内唯一这一事实是正确的。一旦重新启动 VM,就可以重复引用。

与 PID 的情况一样,打印引用文献 #Ref<W.X.Y.Z>包含 - 作为它们的第一个元素( W ) - 有关节点号的信息:

erl -sname right
Erlang R15B (erts-5.9) [source] [64-bit] [smp:4:4] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.9 (abort with ^G)
(right@mars)1> register(right, self()).
true
(right@mars)2> receive M -> M end.
#Ref<6793.0.0.41>
(right@mars)3>

erl -sname left
Erlang R15B (erts-5.9) [source] [64-bit] [smp:4:4] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.9 (abort with ^G)
(left@mars)1> {right, 'right@mars'} ! make_ref().
#Ref<0.0.0.41>
(left@mars)2>

注意在这种情况下 W供引用 0在本地节点, 6793在远方。

关于erlang - erlang refs 在节点/VM 重启之间是唯一的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10029154/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com