十进制转多进制的方式处理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

也可以把基准字符串 打乱,减少什么的 编码后的数据更具有迷惑性

参考博文:

根据用户id生成一个唯一邀请码

上一篇下一篇

猜你喜欢

热点阅读