一个简单的版本比较算法

一个简单的版本比较算法

三月 08, 2019

1.问题产生

服务器同学遇到了一个问题,我们在做强制更新,在服务上做版本比较,用mongodb compile 比较两个字符串发现1.0.1.91.0.1.11版本号大。假设客户端当前的版本是1.0.1.9,在服务器上创建了一个要强制更新的版本号1.0.1.11,这个时候因为mongodb compile 1.0.1.91.0.1.11版本号大,所以不能直接从列表中获取到要更新的版本。

服务器强制更新列表

游戏名称 版本号
王者荣耀 1.0.1.11
王者荣耀 1.0.1.4
吃鸡游戏 1.0.1.8

2.解决办法

强制更新列表添加一个long型字段存储版本号转化值,如下表:

游戏名称 版本号 版本号值
王者荣耀 1.0.1.11 281474976776203
王者荣耀 1.0.1.4 281474976776196
吃鸡游戏 1.0.1.8 281474976776200

思考:
一个long型64位相当于8个字节,每个字节是8位,平均分成四份,每份是2个字节。
2个字节相当于short型,有符号可以达到3万多,没符号的可以达到6万多,完全可以存储每个位数值。

代码步骤:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public static long testSaveBit(){

// 假定一个版本号
String versionName = "1.2.3.4";

// 分割版本号
String[] valueAar = versionName.split("\\.");

long longValue = 0;

// 8个字节 |AA|BB|CC|DD|
// 第1位左移48位,在AA的位置 并或运算
longValue = longValue | (Long.parseLong(valueAar[0]) << 48);
// 第2位左移32位,在BB的位置 并或运算
longValue = longValue | (Long.parseLong(valueAar[1]) << 32);
// 第3位左移16位,在CC的位置 并或运算
longValue = longValue | (Long.parseLong(valueAar[2]) << 16);
// 第4位保持不动,在DD的位置 并或运算
longValue = longValue | (Long.parseLong(valueAar[3]));

// 最后转换成完整的long型
return longValue;
}

最后生成的long型值就可以正确的比较版本号