Python UUID4的较短版本

Python UUID4的较短版本,python,uuid,Python,Uuid,我正在生成python uuid4字符串 我使用它来标识我的服务帐户,但我的一个系统GCP服务帐户有30个字符的限制,现在使用其他帐户已经太晚了: Service account ID must be between 6 and 30 characters. Service account ID must start with a lower case letter, followed by one or more lower case alphanumerical characters tha

我正在生成python uuid4字符串

我使用它来标识我的服务帐户,但我的一个系统GCP服务帐户有30个字符的限制,现在使用其他帐户已经太晚了:

Service account ID must be between 6 and 30 characters.
Service account ID must start with a lower case letter, followed by one or more lower case alphanumerical characters that can be separated by hyphens.
我怎样才能拥有冲突风险有限的UUID的较短版本


我见过一些base64编码黑客,但我能做的最短的是22。理想情况下,我会使用类似git commit hash的东西,因为冲突的风险是有限的。

使用UUID的前15个字符和最后15个字符。忽略中间的一切

import uuid

uuid_str = str(uuid.uuid4()).replace("-","")
uuid_str = uuid_str[:15]+uuid_str[-15:]

使用UUID的前15个字符和最后15个字符。忽略中间的一切

import uuid

uuid_str = str(uuid.uuid4()).replace("-","")
uuid_str = uuid_str[:15]+uuid_str[-15:]
我怎样才能拥有冲突风险有限的UUID的较短版本

删除索引12处的字符,因为它始终是4-

同样地,删除索引16处的字符,因为它总是在8 9 a b中

您将在[0-9a-f]中留下30个相当随机的字符。碰撞仍然很小,可以忽略。请注意,uuid4可能以数字开始,因此您可能需要在生成器中使用拒绝采样,或者直接使用随机生成ID,实际上,使用uuid4没有多大意义

我怎样才能拥有冲突风险有限的UUID的较短版本

删除索引12处的字符,因为它始终是4-

同样地,删除索引16处的字符,因为它总是在8 9 a b中


您将在[0-9a-f]中留下30个相当随机的字符。碰撞仍然很小,可以忽略。请注意,uuid4可能以数字开头,因此您可能需要在生成器中使用拒绝采样,或者直接使用随机生成ID,实际上使用uuid4没有多大意义。

系统允许哪些类型的字符?任意Unicode代码点?任意字节?ASCII码?一些可打印ASCII的子集?如果你已经知道如何将其减少到22个字符,问题是什么?这是google服务帐户:服务帐户ID必须在6到30个字符之间。服务帐户ID必须以小写字母开头,后跟一个或多个可以用连字符分隔的小写字母数字字符。如果我没有其他选择的话,我会选择22,但它并没有给人类可读的文本留下很多空间。系统允许什么类型的字符?任意Unicode代码点?任意字节?ASCII码?一些可打印ASCII的子集?如果你已经知道如何将其减少到22个字符,问题是什么?这是google服务帐户:服务帐户ID必须在6到30个字符之间。服务帐户ID必须以小写字母开头,后跟一个或多个可以用连字符分隔的小写字母数字字符。如果我没有其他选择的话,我会选择22,但它并没有给人类可读的文本留下太多空间。@snakecharmerb我不知道你们的意思。UUID不能保证是唯一的。有一个非零的可能性,它不是唯一的。我的建议保留了所有这些属性——但因为他想要更少的字符,冲突的可能性增加了。如果你的意思是保留格式,那么这并不重要,因为要么他不能使用UUID,要么他必须截断它。如果他真的关心版本和有效位,他可以只获取生成的UUID并删除连字符+最后两个字符。这是一个非常糟糕的字符选择。例如,您保留了3个连字符。@user2357112您是对的,连字符会增加冲突的几率。struid.uuid4.replace-,这是执行uuid.uuid4.hex的愚蠢方法。@wim,这是正确的。对我的代码来说,唯一的补救因素是它没有明显的速度慢,而且还能工作。@snakecharmerb我不知道你的意思。UUID不能保证是唯一的。有一个非零的可能性,它不是唯一的。我的建议保留了所有这些属性——但因为他想要更少的字符,冲突的可能性增加了。如果你的意思是保留格式,那么这并不重要,因为要么他不能使用UUID,要么他必须截断它。如果他真的关心版本和有效位,他可以只获取生成的UUID并删除连字符+最后两个字符。这是一个非常糟糕的字符选择。例如,您保留了3个连字符。@user2357112您是对的,连字符会增加冲突的几率。struid.uuid4.replace-,这是执行uuid.uuid4.hex的愚蠢方法。@wim,这是正确的。对我的代码来说,唯一的弥补因素是它没有明显的速度慢,而且可以正常工作。uuid.uuid4通过os.uradom,这可能比通过随机模块的大多数简单实现更具抗冲突性。使用random.SystemRandom可以直接从random中获得相同的强度,但我不相信大多数人会记住SystemRandom部分。uuid.uuid4通过os.Uradom,也就是li kely被认为比通过random模块实现的最简单的实现更具抗冲突性。使用random.SystemRandom可以直接从random中获得相同的强度,但我不相信大多数人会记住SystemRandom部分。