You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
BookingHeChuan/Myshipping.Application/Helper/SuperShortLinkHelper.cs

121 lines
3.1 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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前面补000000123
/// 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
};
}
}
}