【问题标题】:Convert a number to shorter Alpha Numeric. Better than Base36?将数字转换为更短的字母数字。比 Base36 更好?
【发布时间】:2014-08-15 08:26:40
【问题描述】:

我正在生成一个参考号,该参考号是用户输入的数字。它可以是 30 位左右。

我正在寻找一种方法来缩短用户输入的值,但我需要能够将其转换回原来的数字。

目前base36转

999999999999999999999999999999 (30 digits)
2OY99WNKL1A848GWKS0G (20 characters)

Id' 可能会将其连字符到2OY99-WNKL1-A848G-WKS0G

【问题讨论】:

  • 我假设结果不区分大小写,并且不允许像 á 这样的特殊字符,而只允许 ASCII?

标签: c# encode serial-number


【解决方案1】:

假设您正在查看整数作为输入,您显然可以更改为基数 36(10 个 alpha+ 26 个字符)给您结果。

除此之外,您可以允许上/下,将您的基础扩大到 10+52。

如果您允许所有 ascii(可能不漂亮,但应该可以),您可能会使用 256,因此您可能会减少到 15 左右。

我可能会考虑选择一个我满意的 100 个字符,然后简单地将每 2 个数字转换成该范围内的一个字符。

这里有一些 linqpad 代码,可以输出 144 个可打印(ish)字符:

Array values = Enum.GetValues(typeof(ConsoleKey));//.Dump("all values");
var val_list = values.Cast<ConsoleKey>();
var verbose = from value in val_list
    select new {IntVal = (int) value, 
                IntValPrintsAs = (char)value,
                Value=((ConsoleKey) value), 
                Straight = value
                };
verbose.Dump(); 

如果你忽略一些明显的,比如退格,它可能会给你一个方向:)

【讨论】:

  • 是的,我认为将每对数字编码为一组 100 个字符中的一个是个好主意。对于由 N 位数字组成的每个数字,它将需要 (int)((N+1)/2) 个字符。但是,Unicode 字符是 16 位(在内存中)所以...
  • ln(999999999999999999999999999999) = 69.077。所以假设 70 位,你可以屏蔽它,并使用大约 9 个字节来显示它?
  • 啊,有一个“duh”的时刻。是的,没有基数的日志!= ln,即 log(e)10(所以,2.7),所以它会比我的 prev calc 大。它是 99.66,所以大约 100 位,除以 8 -> 12.5 --> 鼓请...总共 13 个字节 :)(我受过教育)很好。
猜你喜欢
  • 1970-01-01
  • 2022-01-07
  • 2016-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多