Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用特殊字符表示的Python UUID_Python_Algorithm_Uuid_Transpose_Isomorphism - Fatal编程技术网

用特殊字符表示的Python UUID

用特殊字符表示的Python UUID,python,algorithm,uuid,transpose,isomorphism,Python,Algorithm,Uuid,Transpose,Isomorphism,在Python中创建UUID时,如: >>> uuid.uuid1() UUID('a8098c1a-f86e-11da-bd1a-00112444be1e') 如何将UUID映射成一个字符串,该字符串由大写字母a-Z减去字符D、F、I、O、Q和U,再加上数字,再加上字符+和=。i、 e.从整数或字符串到32个相对OCR友好的字符集: [ABCEGHJKLMNPRSTVWXYZ1234567890+=] 我将其称为OCR友好的OCRf集 我想要一个同构函数: def uui

在Python中创建UUID时,如:

>>> uuid.uuid1()
UUID('a8098c1a-f86e-11da-bd1a-00112444be1e')
如何将UUID映射成一个字符串,该字符串由大写字母a-Z减去字符D、F、I、O、Q和U,再加上数字,再加上字符+和=。i、 e.从整数或字符串到32个相对OCR友好的字符集:

[ABCEGHJKLMNPRSTVWXYZ1234567890+=]
我将其称为OCR友好的OCRf集

我想要一个同构函数:

def uuid_to_ocr_friendly_chars(uid)
    """takes uid, an integer, and transposes it into a string made 
       of the the OCRf set
    """
    ...
我的第一个想法是经历将uuid更改为base 32的过程。e、 g

OCRf = "ABCEGHJKLMNPRSTVWXYZ1234567890+="

def uuid_to_ocr_friendly_chars(uid):
     ocfstr = ''
     while uid > 1:
        ocfstr += OCRf[uid % 32]
        uid /= 32
     return ocfstr
然而,我想知道这种方法是否是进行转换的最好和最快的方法,或者是否有一种更简单和更快的方法,例如内置的、更智能的算法,或者只是一种更好的方法


我很感谢你的意见。谢谢。

压缩18.75%,即从32个字符压缩到26个字符,对您来说有多重要?因为,如果保存这一小部分字节不是绝对重要的,那么像uid.hex.upper.replace'D','Z'会按照您的要求执行,而不使用您提供的整个字母表,但唯一的成本是缺少18.75%的压缩


如果压缩每一个字节是至关重要的,我会处理每一个20位的子字符串——这是5个十六进制字符,在你的时髦字母表中是4个字符。剩下的6位加上8位,您可以像上面一样使用hex.upper.replace,因为做任何更高级的事情都没有好处。您可以通过切片.hex很容易地获得子字符串,并将每个子字符串转换为一个带有inttheslice的int,16。然后,基本上可以应用与上面使用的算法相同的算法-但是算法都是在更小的数字上完成的,因此速度增益应该是实质性的。另外,不要通过循环+=-列出所有数字,并在末尾将它们全部连接起来-这也是一种性能改进。

将表示形式压缩18.75%,即从32个字符压缩到26个字符,对您来说有多重要?因为,如果保存这一小部分字节不是绝对重要的,那么像uid.hex.upper.replace'D','Z'会按照您的要求执行,而不使用您提供的整个字母表,但唯一的成本是缺少18.75%的压缩

>>> OCRf = 'ABCEGHJKLMNPRSTVWXYZ1234567890+='
>>> uuid = 'a8098c1a-f86e-11da-bd1a-00112444be1e'
>>> binstr = bin(int(uuid.replace("-",""),16))[2:].zfill(130)
>>> ocfstr = "".join(OCRf[int(binstr[i:i+5],2)] for i in range(0,130,5))
>>> ocfstr
'HLBJJB2+ETCKSP7JWACGYGMVW+'
如果压缩每一个字节是至关重要的,我会处理每一个20位的子字符串——这是5个十六进制字符,在你的时髦字母表中是4个字符。剩下的6位加上8位,您可以像上面一样使用hex.upper.replace,因为做任何更高级的事情都没有好处。您可以通过切片.hex很容易地获得子字符串,并将每个子字符串转换为一个带有inttheslice的int,16。然后,基本上可以应用与上面使用的算法相同的算法-但是算法都是在更小的数字上完成的,因此速度增益应该是实质性的。另外,不要通过循环+=-列出所有数字,并在末尾加入它们-这也是一种性能改进

>>> OCRf = 'ABCEGHJKLMNPRSTVWXYZ1234567890+='
>>> uuid = 'a8098c1a-f86e-11da-bd1a-00112444be1e'
>>> binstr = bin(int(uuid.replace("-",""),16))[2:].zfill(130)
>>> ocfstr = "".join(OCRf[int(binstr[i:i+5],2)] for i in range(0,130,5))
>>> ocfstr
'HLBJJB2+ETCKSP7JWACGYGMVW+'
重新皈依

>>> "%x"%(int("".join(bin(OCRf.index(i))[2:].zfill(5) for i in ocfstr),2))
'a8098c1af86e11dabd1a00112444be1e'
重新皈依

>>> "%x"%(int("".join(bin(OCRf.index(i))[2:].zfill(5) for i in ocfstr),2))
'a8098c1af86e11dabd1a00112444be1e'
是的,这种方法确实让我有点不舒服,谢谢你的询问


是的,这个方法确实让我有点不舒服,谢谢你的提问。

没有必要对binstr这么着迷-你只需要在UUID上获取.bytes属性就可以得到它的二进制表示。@Nick Johnson,你能解释一下你的意思吗?我不知道如何将.bytes重新组合为base 32,只需使用base 32或此处建议的任何其他编码方案对其进行编码即可。我的观点是,如果您有一个真正的UUID对象,那么代码段的第三行可以替换为UUID.bytes。没有必要使用binstr,您只需获取UUID上的.bytes属性即可获得其二进制表示形式。@Nick Johnson,您能解释一下您的意思吗?我不知道如何将.bytes重新组合为base 32,只需使用base 32或此处建议的任何其他编码方案对其进行编码即可。我的观点是,如果您有一个真正的UUID对象,那么代码段的第三行可以替换为UUID.bytes.re。太空奇遇-很好的一点-虽然从天文角度来看,与a.replace'O'、'D'/等发生碰撞的可能性很小。更重要的一点是要有一个简化的,尽管很时髦的字母表,它使用较少的视觉上模棱两可的字符,例如D、O、Q和0。@Brian,如果只使用uid.hex.upper.replace'D',Z',我看不出会发生什么冲突D'是十六进制集中唯一可能与另一个“0”混淆的字符,数字zeroOh抱歉-我想第二段中建议的算法会将替换的“D”和“Z”应用于20位子字符串。同意。太空奇遇-很好的一点-虽然从天文角度来看,与a.replace'O'、'D'/等发生碰撞的可能性很小。更重要的一点是要有一个简化的,尽管很时髦的字母表,它使用较少的视觉上模棱两可的字符,例如D、O、Q和0。@Brian,如果只使用uid.hex.upper.replace'D',Z',我看不出会发生什么冲突。
“D”是十六进制集中唯一可能与另一个“0”混淆的字符,数字zeroOh抱歉-我想第二段中建议的算法会将替换“D”和“Z”应用于20位子字符串。