1.可用于邀请码生成
2.可用于短链
public class ShareCodeUtil
{
//自定义进制所用的编码,大小写和数字(初始62位),但去掉7位相似:O/o/0,I/i/1/l,去掉一个补位:A;最终只留(26+26+10)-(7+1)=54位
private static char[] BASE = new char[]
{'8', 'S', '2', 'H','b', 'V','c', 'E', 'Z','g', 'X','h', '9','z','y', 'C','x', '7', 'P','p','5', 'K','B', 'G', 'Q',
'U', 'F', 'R', '4', 'u','W', 'n','Y','D','d', 'e','f','a', '3', 't','M','q', 'J','r','s','L', 'm','T', 'N','w', '6','v', 'j','k',
};
//A补位字符,不能与自定义重复
private static char SUFFIX_CHAR = 'A';
//进制长度
private static int BIN_LEN = BASE.Length;
//生成邀请码最小长度
private static int CODE_LEN = 6;
/// <summary>
/// ID转换为邀请码
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public static string IdToCode(long id)
{
char[] buf = new char[BIN_LEN];
int charPos = BIN_LEN;
//当id除以数组长度结果大于0,则进行取模操作,并以取模的值作为数组的坐标获得对应的字符
while (id / BIN_LEN > 0)
{
int index = (int)(id % BIN_LEN);
buf[--charPos] = BASE[index];
id /= BIN_LEN;
}
buf[--charPos] = BASE[(int)(id % BIN_LEN)];
// 将字符数组转化为字符串
string result = new string(buf, charPos, BIN_LEN - charPos);
// 长度不足指定长度则随机补全
int len = result.Length;
if (len < CODE_LEN)
{
StringBuilder sb = new StringBuilder();
sb.Append(SUFFIX_CHAR);
Random random = new Random();
// 去除SUFFIX_CHAR本身占位之后需要补齐的位数
for (int i = 0; i < CODE_LEN - len - 1; i++)
{
sb.Append(BASE[random.Next(BIN_LEN)]);
}
result += sb.ToString();
}
return result;
}
/// <summary>
/// 邀请码解析出ID,基本操作思路恰好与idToCode反向操作。
/// </summary>
/// <param name="code"></param>
/// <returns></returns>
public static long CodeToId(String code)
{
char[] charArray = code.ToCharArray();
long result = 0L;
for (int i = 0; i < charArray.Length; i++)
{
int index = 0;
for (int j = 0; j < BIN_LEN; j++)
{
if (charArray[i] == BASE[j])
{
index = j;
break;
}
}
if (charArray[i] == SUFFIX_CHAR)
{
break;
}
if (i > 0)
{
result = result * BIN_LEN + index;
}
else
{
result = index;
}
}
return result;
}
/// <summary>
/// 显示用于进制编码的所有字符串
/// </summary>
/// <returns></returns>
public static string PrintBase()
{
StringBuilder UpperCase = new StringBuilder();
StringBuilder LowerCase = new StringBuilder();
StringBuilder Number = new StringBuilder();
Array.Sort(BASE);
foreach (var item in BASE)
{
int ascii = (int)item;
if(ascii>= 48 && ascii<=57)
{
Number.Append(item) ;
}
else if (ascii >= 65 && ascii <= 90)
{
UpperCase.Append(item);
}
else if(ascii >= 97 && ascii <= 122)
{
LowerCase.Append(item);
}
}
var allStr = UpperCase.Append(",").Append(LowerCase).Append(",").Append(Number).ToString();
return $"Count({allStr.Length-2}):{allStr}";
}
}
8762

被折叠的 条评论
为什么被折叠?



