更多数据请见:https://docs.qq.com/sheet/DTmtNUHNIeFBmYkZy
请帮助分析这些数据是否有 规律? 然后可以通过该规律生成更多的 数据?
11899561050169867
11899561050169928
11899561050169997
11899561050180107
11899561050180138
11899561050180145
11899561050180183
11899561050180305
11899561050180312
11899561050180350
11899561050180381
11899561050182071
11899561050182415
11899561050182439
11899561050182446
11899561050182453
11899561050182460
11899561050182477
11899561050182484
11899561050182491
11899561050182552
11899561050183016
11899561050183092
11899561050183344
11899561050183351
11899561050183504
11899561050184297
11899561050189032
11899561050189049
11899561050189124
11899561050189179
11899561050189360
11899561050189421
11899561050189476
11899561050189568
11899561050189599
11899561050189629
11899561050410006
11899561050410082
11899561050410211
11899561050410228
11899561050410235
11899561050410266
11899561050410334
11899561050410396
11899561050410440
11899561050410464
11899561050410549
11899561050410570
11899561050410754
11899561050410815
11899561050410839
11899561050410860
11899561050410891
11899561050412574
11899561050416220
11899561050416237
11899561050416251
11899561050416268
11899561050416282
11899561050416299
11899561050417012
11899561050417029
11899561050417081
11899561050417142
11899561050417173
11899561050417197
11899561050417265
11899561050417302
11899561050417333
11899561050417418
11899561050417487
11899561050417739
11899561050418071
11899561050418088
11899561050418200
11899561050418286
11899561050418415
11899561050418453
1、数据为10+7位,共计17位,前10位为固定值;
2、10位估计是自UTC 时间 1970-01-01 00:00:00 以来所经过的秒数,7位可能是随机的值;
3、这样可以每秒生成百万级的订单编号。
前13为是时间戳:1970年1月1日到目标时间的毫秒数。后四位是一个不重复的递增的值(遇到相同的时间就从0开始算)。
测试代码
public static void main(String[] args) {
long[] number = new long[] {
1189956105016L
,1189956105018L
,1189956105041L
};
for(int i = 0; i < number.length; i++) {
java.util.Date date = new java.util.Date(number[i]);
java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");
System.out.println(sdf.format(date));
}
}
运行结果:
2007/09/17 00:21:45.016
2007/09/17 00:21:45.018
2007/09/17 00:21:45.041
继续生成的话,按照最后一个数的时间和后四位递增数字为基准。
往后增加时间和递增数字就可以了。
但是,每个数据时间递增多少,后面的四位数字递增多少完全没有规律。
比如用户下单的时间,后四位从0开始按照一个随机数递增。
数据格式可以按上面的做,验证合法性的话这个服务器说了算,
如果生成的数字存服务器里,然后每次去服务器验证这个数字有没有的话,那就算格式相同也不行。
前13位为时间的毫秒时间错 + 4为递增数据 。至于4位递增的数据,看了数据的递增步长发现规律不一致,不一致估计是有自增的数据被消耗了,不是同一个毫秒的时间后四位重新开始递增
这个数据集规律也太弱了 ,且数据集数量过小,很难预测后面的。有几个突变都怪怪的,没有办法预测的,假设你的数据从后25个之后开始稳定,我预测了一下,大概是这样
数据为10+7位,共计17位,前10位估计是自(UTC)1970-01-01 00:00:00以来所经过的秒数总和,后7位可能是随机的值;
long类型 随机递增的吧
希望如下方案对你有所帮助:
for (int i = 0; i < 10; i++) {
long lastId = 11899561050418453L;//lastId:代表上一个主键id ,此处为了演示效果写死一个固定值,实际情况下,换成上一次生成的最新id值(生成的id就会自增)
String lastFiveNum = String.valueOf(lastId).substring(12);//获取lastId最后5位
Random ran = new Random();
long randomNum = (long)ran.nextInt(9999);
Long newFiveNum = Long.parseLong(lastFiveNum) + randomNum;
String newId = String.valueOf(lastId).substring(0,12)+newFiveNum;//拼接新的id
System.out.println("新的id:"+newId);
}
主键由17位数字组成,前10位是截止到秒的系统时间对应的long型值,中间2位应该是跟业务有关的编码值,最后5位是上一个id加上随机数,最后拼接而成
望采纳
就是个时间戳加计数器吧
能看出来这是递增序列,后面的数比前面的数大,变化有个范围,在范围内是随机的。代码和很简单,你可以试试。当然了,如果愿意,可以用循环神经网络进行预测后面的数字,或者可以用NLP预测后面的数字,都可以做到。不过这样就要求样本量大一些了。
1189956105:应该是精确到毫秒的时间戳
后面7位数可能是随机数,也可能是递增数,唯一的。
哪里来的数据,盲猜规律呀?
可以看出是一个递增序列,可以找出增加的最大值和最小值,每次random在这个区间生成要加的数,和当前相加生成下一个
用深度学习试试,把这些点加上一个横坐标,线性规划然后
第一眼看以为是快递单号
几种可能,
第一种是 11899561050 + 随机数
第二种是 固定编码+顺序数+校验位
判断这两种可能性,那就看有多少数据量可以分析。 如果有过亿的数据可以看,或者时间跨度几年的数据来看,就容易确定。
我感觉第二种可能性比较大
规律大概(个人认为):10位数时间戳+0到10000000之间取一个随机数。
public static Long getId() {
// 当前时间戳
//final String str = String.valueOf(System.currentTimeMillis() / 1000);
final String str = "1189956105";
int randomInt = RandomUtil.randomInt(0, 10000000);
String res = str + randomInt;
return Long.valueOf(res);
}
应该是一个random的数列, 但其中差值为7,13,17,31的很多,可能是语言的random中倾向与质数,用random继续生成就行
11899561050169867
11899561050169928
11899561050169997
11899561050180107
11899561050180138
是个编号规则,前面按照某种编号生成11899561050,后面169867应该是个递增数,但不是连续的,可能和生成的时间有关(微秒不可能是连续的)。
后四位应该是一个random数。前面位一个固定。用于产品每一批次产品标识。不治道对不对
能提供是怎么来得吗?
这里可以给个思路,前缀+自定义时间戳
目前尚不知前缀1189956从何而来。
但后缀10位数是取自一个自定义的时间戳(正常取值为当前时间减去1970年第一天的秒数,但程序设计了一个自定义时间):
vf
生成新的序列
for i=1 to 1000
?"1189956"+str(datetime()-datetime(1988,8,15,0,0,0))
endfor
c#
for(int i = 0; i < number.length; i++) {
TimeSpan ts1 =DateTime.UtcNow - new DateTime(1988,8,15, 0, 0, 0, 0);
Console.WriteLine("1189956"+ ts1.TotalSeconds.tostring());
}
没有规律,按顺序的,中奖id之类的吧
也许就是UUID方法生成的
前面好像还有点规律,但是后面好像有问题,可视化出来:
感觉像会员的订单号之类的。
1189956 1050 180107
机构号 + 地区(或者门店) + 时间戳截取
我猜大概是这样。
会不会只是一个简单的ID生成?
首先他有顺序关系吗