十进制转多进制的方式处理URL中显示的数据库自增ID
2018-12-18 本文已影响0人
简石榴
问题概述:
一次转盘抽奖项目中,为了避免现场活动中参与者,多次兑奖的情况,需要提供相应的“核销码”。
具体分析:
“核销码”应该具有唯一性。其次“核销过程”应该尽量简化(后面实践中采用按钮的形式,没有了“核销码”)
为了实现核销码的唯一性,虽然存在相关类似idCreator 这样的id生成器的存在,但这是复杂且不合理的。反观现有的数据仓储方式,粗糙的应用了EFCore框架 数据库中存在自增主键唯一标识一条记录,可以完美的充当“核销码”的角色。
经过上面的分析,我们准备用数据库中自增的主键来实现“核销码”的要求。这样就面临题目中所提到的将数据库中自增主键暴露出去的问题。下面采用的十进制转多进制的实现方式解决这个问题。
public static string source_string = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
public static string enCode(int num)
{
var code = string.Empty;
while (num>0)
{
var mod = num % 36;
num = (num - mod) / 36;
code = source_string[mod] + code;
}
if(code.Length<6)
code = code.PadLeft(6, '0');
return code;
}
public static int deCode(string code)
{
var num = 0.0;
if (code.LastIndexOf('0') != -1)
code = code.Substring(code.LastIndexOf('0') + 1);
code = new string(code.ToCharArray().Reverse<char>().ToArray<char>());
foreach (var c in code)
{
num += source_string.IndexOf(c) * Math.Pow(36, code.IndexOf(c));
}
return Convert.ToInt32(num);
}
例如 12345 经过上述编码过程后 编码为 0009IX
也可以把基准字符串 打乱,减少什么的 编码后的数据更具有迷惑性
参考博文: