2010-01-06 136 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)