我正在使用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-1
或1/1/1
) - 将您的两个
ushort
S和uint
组合到ulong
中,然后将其放在URL
中 - 将八个字节组合到一个数组中,base64对其进行编码,然后将其放在url 中
我会选择第二个 - 大部分时间可能是最短的,并且是最可读的。