base64编码替代下划线

时间:2011-07-28 11:05:14

标签: .net encoding azure

我们正在使用base64编码的文件系统/ url安全变体,以便:

"=" replaced with ""  
"+" replaced with "-"  
"/" replaced with "_"  

我们现在使用Azure blob存储,不允许在容器名称中使用“_”。

我们是base64编码 Guid 。如果我要用“0”替换下划线,我是否有碰撞风险?

更新

不确定为什么要downvote。但要澄清一下。

为什么不使用Guid?

  1. Guid是我的应用程序中的实体的ID。由于路径是公共的,我不喜欢暴露Id,因此我为什么要对它进行编码。
  2. 我想要更短更友好的路径。与下面的评论之一相反,基本64编码不再是:

    指导:5b263cdd-2bc2-485d-83d4-81b96930dc5a
    Base64编码:3TwmW8IrXUiD1IG5aTDcWg ==(删除后更短==)

  3. (另一个)更新

    似乎对我正在努力实现的目标存在一些困惑(对此抱歉)。这是短版本。

    • 我有一个代表我的应用程序中的实体的Guid。
    • 我需要为实体创建一个可公开访问的目录(通过 一个网址)。
    • 我不想将Guid用作目录名,原因如下 以上。
    • 我先前询问过如何生成更友好的东西 看起来保证唯一性的Url并没有暴露出来 原始的Guid。建议是Base64编码。
    • 直到最近我们需要使用Azure blob时才能正常工作 存储,它不允许在其目录中下划线“_” (容器)名称。

    这就是我所在的地方。

4 个答案:

答案 0 :(得分:7)

只需在base16中“编码”GUID即可。它使用的唯一字符是0123456789ABCDEF,对于大多数用途来说应该是安全的。

var encoded = guid.ToString("N");

答案 1 :(得分:1)

基本64字符集是

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=

所以你不能使用0,因为它已经在使用。

答案 2 :(得分:0)

您可以在base60中对数据进行编码,而不是使用base64并更改4个字符。

您的base60字符列表不包含您不喜欢的4个字符,因此无需替换任何内容。

答案 3 :(得分:0)

对标识符进行编码不会对其进行加密。任何精通技术的观察者都可以对标识符进行base64解编码。如果要使路径不透明,请对其加密或用盐对其进行哈希处理。如果确实要保持路径透明,请使用不带连字符或大括号的十六进制。这样,您的UUID会序列化为32个代码点,而Azure容器名称最多可以包含63个字符。


如果您确实想要更短,更有趣的容器名称,并且如果Azure支持国际化域名,则盲文编码适合作为最少可印刷的选项。这是一个Haskell单行代码,用于生成UUIDv4,将UUID的每个八位字节映射到盲文字母,并以UTF-16BE(总共32个八位字节)编码结果字符串。

import Data.Binary (encode)
import Data.ByteString.Lazy (intersperse, cons)
import Data.Functor ((<&>))
import Data.UUID.V4 (nextRandom)

braille :: IO Data.ByteString.Lazy.Internal.ByteString
braille = nextRandom <&> encode <&> intersperse 40 <&> cons 40

(在F#中,将使用|>代替<&>。)

为了娱乐,请参见以下要点,以了解如何将八位字节流转换为UTF-16LE或UTF-8编码的盲文字符串,从而使每一位字面上都脱颖而出。

https://gist.github.com/bjartur/ea5db281f0b88128455ed79621abbd1d