2010-01-06 192 views
1

沒有人有一個GUID來Base34編碼器/解碼器一個不錯的代碼片段,我以前用Google搜索周圍,並沒有真正發現任何的良好來源。GUID來Base34編碼器/解碼器

+0

你真的想說base34嗎? – Joe 2010-01-06 14:31:38

+0

Base64是常見的; Base32更少。 Base34聽起來像一個混合 – MSalters 2010-01-06 14:46:39

+0

Base34,字母數字只有實例或01或OI。 – 2010-01-06 15:10:09

回答

2

Number base conversion class in C#可以很容易地擴展,如果你認爲人們會混淆S和5或B和6或我做base34(或其他人和j或B和8或9和g或任何)

+1

像這樣的項目正是我所期待的。至少它比Guid少8個​​字符,讓客戶通過電話讀回代理商! – 2010-01-07 16:21:21

+0

雖然我也注意到,如果你換成小數渴望在他的代碼,以支持它似乎推出某種類型的浮點運算問題引起至少顯著位是不正確的,如果你的編碼一個號碼,然後解碼它,你的高階值獲得不同的價值。當然,把Guid分成4個字符是很簡單的。雖然這讓我懷疑是否會有一段時間,一個4位數的十六進制數轉換爲base34將會是除了3位數的base34數之外的任何值。 – 2010-01-07 16:37:31

0

這裏的關鍵方法是ToByteArraythis particular constructor

編碼:

string encodedGuid = Convert.ToBase64String(guid.ToByteArray()); 

解碼:

Guid guid = new Guid(Convert.FromBase64String(encodedGuid)); 
+2

這是Base32,仍然不是Base34。 – MSalters 2010-01-06 14:46:04

+0

@MSalters如何從Base64變成Base32? – 2010-01-06 15:14:40

1

這裏的一個簡化的版本...基本上,它需要一個字符串,計算MD5哈希,提取前四個字節爲一個無符號升ong(將字符串有效映射到一個4字節數字),將其轉換爲base36,然後爲「X」和「Y」交換「哦」和「零」字符。然後,它確保最終的字符串只有六個字符,如果需要填充「Z」字符。

 
require 'digest/md5' 

# create an easy-to-read 6-digit unique idno 
idno = original # starting string 
idno = Digest::MD5.digest(idno).unpack("N").first # digest as unsigned long 
idno = idno.to_s(36).upcase.tr("0O","XY") # convert to base34 (no "oh" or "zero") 
idno = idno[0,6].ljust(6,"Z") # final 6-digit unique idno (pad with "Z" chars)