|
|
using Microsoft.Extensions.Options;
|
|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
using System.ComponentModel.DataAnnotations;
|
|
|
using System.Linq;
|
|
|
using System.Text;
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
namespace Myshipping.Application
|
|
|
{
|
|
|
public class SuperShortLinkHelper
|
|
|
{
|
|
|
private readonly string _base62CharSet;
|
|
|
private readonly int _codeLength;
|
|
|
|
|
|
public SuperShortLinkHelper(IOptionsSnapshot<ShortLinkOptions> option)
|
|
|
{
|
|
|
_base62CharSet = option.Value.Secrect;
|
|
|
_codeLength = option.Value.CodeLength;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 补充0的长度
|
|
|
/// </summary>
|
|
|
private int ZeroLength
|
|
|
{
|
|
|
get
|
|
|
{
|
|
|
return MaxValue.ToString().Length;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// Code长度位数下能达到的最大值
|
|
|
/// </summary>
|
|
|
private long MaxValue
|
|
|
{
|
|
|
get
|
|
|
{
|
|
|
var max = (long)Math.Pow(62, _codeLength) - 1;
|
|
|
return (long)Math.Pow(10, max.ToString().Length - 1) - 1;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 【混淆加密】转短码
|
|
|
/// 1、根据自增主键id前面补0,如:00000123
|
|
|
/// 2、倒转32100000
|
|
|
/// 3、把倒转后的十进制转六十二进制(乱序后)
|
|
|
/// </summary>
|
|
|
public string Confuse(long id)
|
|
|
{
|
|
|
if (id > MaxValue)
|
|
|
{
|
|
|
throw new Exception($"转换值不能超过最大值{MaxValue}");
|
|
|
}
|
|
|
|
|
|
var idChars = id.ToString()
|
|
|
.PadLeft(ZeroLength, '0')
|
|
|
.ToCharArray()
|
|
|
.Reverse();
|
|
|
|
|
|
var confuseId = long.Parse(string.Join("", idChars));
|
|
|
var base62Str = Encode(confuseId);
|
|
|
return base62Str.PadLeft(_codeLength, _base62CharSet.First());
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 十进制 -> 62进制
|
|
|
/// </summary>
|
|
|
public string Encode(long value)
|
|
|
{
|
|
|
if (value < 0)
|
|
|
throw new ArgumentOutOfRangeException("value", "value must be greater or equal to zero");
|
|
|
|
|
|
var sb = new StringBuilder();
|
|
|
do
|
|
|
{
|
|
|
sb.Insert(0, _base62CharSet[(int)(value % 62)]);
|
|
|
value /= 62;
|
|
|
} while (value > 0);
|
|
|
|
|
|
return sb.ToString();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
public class ShortLinkOptions
|
|
|
{
|
|
|
|
|
|
public const string SectionName = "ShortShareLink";
|
|
|
|
|
|
/// <summary>
|
|
|
/// 短码长度
|
|
|
/// </summary>
|
|
|
[Range(1, int.MaxValue)]
|
|
|
public int CodeLength { get; set; }
|
|
|
|
|
|
/// <summary>
|
|
|
/// 62位加密秘钥
|
|
|
/// </summary>
|
|
|
[Required]
|
|
|
public string Secrect { get; set; }
|
|
|
|
|
|
/// <summary>
|
|
|
/// 缓存数量限制
|
|
|
/// </summary>
|
|
|
public int? CacheCountLimit { get; set; }
|
|
|
|
|
|
/// <summary>
|
|
|
/// 生成默认数据
|
|
|
/// </summary>
|
|
|
public static ShortLinkOptions GenDefault()
|
|
|
{
|
|
|
return new ShortLinkOptions()
|
|
|
{
|
|
|
CacheCountLimit = 10000
|
|
|
};
|
|
|
}
|
|
|
}
|
|
|
}
|