Postgres的uuid-ossp模块扩展(插件)提供了这种生成UUID值的替代方法。
uuid_generate_v1mc()
此函数生成版本 1 UUID,但使用随机多播 MAC 地址而不是计算机的真实 MAC 地址。
我假设这里的目的是解决有关记录数据库服务器 MAC 地址的安全问题。因此,我们希望在其位置使用另一个备用MAC 地址作为生成版本 1 UUID值的一部分。
我的问题是:这个“随机多播 MAC 地址”到底是什么来代替数据库服务器自己的 MAC?
我用谷歌搜索/搜索但没有找到很好的解释。这是在数据库服务器的本地网络上找到的当前正在使用的其他 MAC 吗?
在 Postgres 的主键上下文中,使用此命令涉及哪些实际问题?
重复调用的示例数据uuid_generate_v1mc
,第一列中包含 UUID 值:
e2a03f96-0e7f-11ea-9838-6bba9e946aa0 Bird 2019-11-24 06:01:41.394401
e30c64be-0e7f-11ea-8540-9b38c7ef1573 Bird 2019-11-24 06:01:42.108340
e33037ea-0e7f-11ea-ab4b-abc4bdb5ea40 Bird 2019-11-24 06:01:42.342973
e3495cca-0e7f-11ea-8070-03c037680e82 Bird 2019-11-24 06:01:42.507537
e3668dd6-0e7f-11ea-b4e7-87c2c65a3777 Bird 2019-11-24 06:01:42.699283
RFC4122文档(第 4.1.6 节)指定:
如果我解释正确,我会说:随机多播地址是任何随机生成的 MAC 地址,它只设置了多播位。多播位只是 UUID 的节点部分的位之一(出于所有实际目的,这只是强制设置 UUID 的一个特定位)。
旁注
我认为您实际上不能为 PostgreSQL 函数指定 MAC 地址。如果它遵循 RFC,则函数必须使用系统中可用的任何MAC 地址,或者使用随机的 MAC 地址(设置特定位)。
对于特定机器,这个随机值是否总是相同(对我来说看起来不是很随机)或者只是纯粹(伪)随机并且每次都在变化,从这个解释中不清楚......但可以很容易测试:
现在得到我:
这转换为(使用来自https://stackoverflow.com/questions/1709600/what-kind-of-data-can-you-extract-from-a-uuid的 PERL 程序)
和
...所以,MAC 实际上是完全(伪)随机的。
正如@EvanCarrol 所指出的:我也认为使用v4 UUID 会更好,我认为随机生成的MAC 不会减少碰撞风险。
此外,很多网络设备(路由器、交换机等)都具有可编程MAC 地址(当您想用另一个损坏的设备替换一个损坏的设备时,这非常方便,并确保所有其他设备根本没有注意到任何差异) . 不知何故,这使得 MAC不像您想象的那样独特。
Alternatvies:如果您使用 Windows,可能是此工具可以让您伪造MAC 地址。我自己没有尝试过,所以,“没有附加条件”。