【问题标题】:URL safe UUIDs in the smallest number of characters最少字符数的 URL 安全 UUID
【发布时间】:2012-07-11 11:42:03
【问题描述】:

理想情况下,我想要example.com/resources/äFg4вNгё5 之类的东西,可见字符的最少数量,不要介意在通过 HTTP 传输它们之前必须对它们进行百分比编码。

你能说出一个将 128b UUID 有效地编码为最少数量的可见字符的方案,而不会使结果中出现破坏 URL 的字符吗?

【问题讨论】:

  • 国际字符仍然有点像蠕虫;它可能总是在浏览器中工作,但如果你在不同的应用程序中复制粘贴,例如邮件客户端、即时通讯程序,或者最脆弱的情况下,SMS,它们就会中断。答案建议的 Base64 仍然是最好的方法,除非您做出危险的假设,即用户不会在同一个网络浏览器之外使用这些链接。

标签: language-agnostic uuid


【解决方案1】:

Base-64 对此很有用。

{098ef7bc-a96c-43a9-927a-912fc7471ba2}

可以编码为

vPeOCWypqUOSepEvx0cbog

末尾的通常等号可以删除,因为它们总是使字符串长度成为 4 的倍数。您可以使用一些安全字符来代替+/。你可以选择两个:-._~

更多信息:

【讨论】:

    【解决方案2】:

    我使用 url 安全的 base64 字符串。以下是执行此操作的一些 Python 代码*

    最后一行删除了 base 64 编码喜欢放在末尾的 '=' 或 '==' 符号,它们使将字符放入 URL 变得更加困难,并且只需要对信息进行反编码,这确实不需要在这里做。

    import base64
    import uuid
    
    # get a UUID - URL safe, Base64
    def get_a_Uuid():
        r_uuid = base64.urlsafe_b64encode(uuid.uuid4().bytes)
        return r_uuid.replace('=', '')
    

    *确实遵循标准:base64.urlsafe_b64encode 遵循 RFC 3548 和 4648,请参阅 https://docs.python.org/2/library/base64.html。允许从已知长度的 base64 编码数据中剥离 ==,请参阅 RFC 4648 §3.2。 UUID/GUID 在RFC 4122 中指定; §4.1 Format 声明“UUID 格式为 16 个八位字节”。 base64-fucntion 对这 16 个八位字节进行编码。

    【讨论】:

    • 不适用于 python3,您应该使用:return base64.urlsafe_b64encode(uuid.uuid4().bytes).strip("=")(也适用于 python 2,返回 unicode 字符串)。
    • 您是将 URL 安全 uuid 保存为模型 uuid 还是根据需要来回转换?
    • @ReducedGosling 我将 URL 安全保存
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    • 2010-10-08
    • 2013-09-03
    相关资源
    最近更新 更多