2010-02-14 30 views
9

GUID是以HEX爲基礎顯示的大隨機數。我想以較短的格式顯示此號碼,可以根據所有字母和數字說出。這是一個36基礎。以36個字母的格式顯示GUID

可以這樣說:2f1e4fc0-81fd-11da-9156-00036a0f876a將變成3jEl9x6eZi

在.Net中是否有任何「準備好」的算法?

它需要是雙向的。

編輯:使用Base64是更好的解決方案。唯一的問題是Base64包含/字符,它不適用於URI

+0

對於基地64,你可以用有效的(但尚未使用)的人代替無效字符。 IIRC,略少於96個可打印的ASCII字符。 – Steve314 2010-02-14 01:06:34

+0

看看我的答案,看看我如何修正==,/和+問題 – Fredou 2010-02-14 02:22:50

回答

1

Base64是我用,this將修復該問題與==和/和+

2

你介紹它,它是不可能的。你必須丟失信息:

>>> 16 ** len('2f1e4fc081fd11da915600036a0f876a') 
340282366920938463463374607431768211456 
>>> 36 ** len('3jEl9x6eZi') 
3656158440062976 

你需要更多的基數36位數來覆蓋所有可能的值。爲什麼不使用base 64呢?結果會更短(我假設這是這裏的目標),並且在.NET中有一個標準的解決方案。

+0

值'3jEl9x6eZi'只是例如,它不是'真正'的價值。 – 2010-02-14 01:04:16

0

我認爲最接近的,你會發現它是Base36然而它不會與GIUD類型(只有一個Int16,Int32或Int64)工作。

8

這種轉換沒有內置任何內容。內置在使用基地64編碼一些接近:

string base64 = Convert.ToBase64String(theGuid.ToByteArray()) 
+0

好的解決方案。但爲什麼每個字符串都以'=='結尾? '='它不是Base64格式的有效值。 – 2010-02-14 01:08:13

+2

@Mendy:=字符用於填充最後一個字符組。 (它在RFC 1421標準中有規定。) – Guffa 2010-02-14 01:22:45