从代码中的长数中提取三个数字



我正在使用ASP.NET C#和MySQL构建自己的分片解决方案。对于每行的ID,我使用以下内容:

  • shard ID -int(1-65535)
  • 表类型ID-小int(1-65535)
  • 增量号(1-4294967295)

因此,例如,ID应该像这样:

http://mywebsite.com/folders/65535655354294967297

我想知道的是如何将数字组合到一个大数字中,以便以后可以提取数据。因此,例如,我不会将1用作碎片ID,我可能需要给您00001,因为以后通过在整个数字上进行划分来提取该数字会更容易。

那么,我该怎么做,什么是用三个单独的数值构建长数的最佳方法,然后能够在代码中提取它们?

我在C#

中寻找最大的有效

谢谢。

您几乎描述了问题中的答案。为每个数字定义一个固定宽度。

int iShardId = 12; // Fixed width of 5
int iTableTypeId = 840; // Fixed width of 5
long lIncremental = 967295; // Fixed width of 10
string sMyId = String.Concat(iShardId.ToString("00000"), iTableTypeId.ToString("00000"), lIncremental.ToString("0000000000"));

然后,您可以使用REGEX稍后(通过IHTTPMODULE或其他)解析字符串:

RegEx rMyText = new RegEx(@"/(?<shard>[0-9]{5})(?<table>[0-9]{5})(?<inc>[0-9]{10})/?$");
Match mMyValues = rMyText.Match(Request.Url.AbsolutePath);
if (mMyValues.Success) {
    int iShardId = Convert.ToInt32(mMyValues["shard"].Value);
    int iTableTypeId = Convert.ToInt32(mMyValues["table"].Value);
    long lIncremental = Convert.ToInt64(mMyValues["inc"].Value);
}
else {
    //The input didn't match
}

正则旨在作为解析数字的示例,但显然取决于您计划实施的方式,您应该对其进行调整以确保输入仅限于您通过使用开始/终止斜线或终止您期望的值字符串的结尾($)。

您可以使用数字的十六进制

ushort ShardId=1;
ushort TableTypeId = 100;
uint IncrementalNumber = 1000;
string url = ShardId.ToString("X4") + TableTypeId.ToString("X4")
                                    + IncrementalNumber.ToString("X8");
var i1 = Convert.ToUInt16(url.Substring(0, 4), 16);
var i2 = Convert.ToUInt16(url.Substring(4, 4), 16);
var i3 = Convert.ToUInt32(url.Substring(8, 8), 16);

string url = (((ulong)ShardId << 48) | ((ulong)TableTypeId << 32) | IncrementalNumber)
             .ToString("X16");
var u  = Convert.ToUInt64(url,16);
var i1 = (ushort)(u >> 48);
var i2 = (ushort)((u >> 32) & 0xffff);
var i3 = (uint)(u & 0xffffffff);

解决方案可能是使用二进制数字并将它们加在一起以形成一个数字。

  • shard ID -int(1-65535)
  • 表类型ID-小int(1-65535)
  • 增量号(1-4294967295)

碎片ID和表ID都需要16位,而增量数则需要16位。这意味着您可以用64位表示数据。

示例:

shard ID

dec:7

bin:0000 0000 0000 0111

表类型ID

dec:2435

bin:0000 1001 1000 0011

增量号

dec:23456457

bin:0001 0110 0101 1110 1010 1100 1001

最终号码

concat

之类的二进制值

碎片ID 表类型ID 增量编号

bin:0000 0000 0000 0111 0000 1001 1000 0011 00100 0001 0110 010111111010 1010 1100 1100 1001

12月:1980783105796809

几个选项,大约是最长(最可读?)到最短(最不可读)

  • 将每个数字带到零以最长的时间为( 00001000010000000001
  • 将数字与连字符甚至斜线分开(1-1-11/1/1
  • 将您的两个ushort S和uint组合到ulong中,然后将其放在URL
  • 将八个字节组合到一个数组中,base64对其进行编码,然后将其放在url

我会选择第二个 - 大部分时间可能是最短的,并且是最可读的。

最新更新