背景
在对接一个OA系统的时候,加密方式只提供了java
的例子,有个步骤需要对参数的数组进行排序,用的是Arrays.sort()
,对接的时候用的是php
的sort()
函数,排序之后发现两边对不上
PHP代码
$arr = [4367604, 'XT-6a42ab94-9124-4c44-bbc2-5f56c6fcfd99', '2321c578da9446215fcefe12adf6e2nb', '647ea7db53a88', '1686022107'];
sort($arr);
var_dump($arr);
输出结果
array(5) {
[0]=>
string(32) "2321c578da9446215fcefe12adf6e2nb"
[1]=>
string(13) "647ea7db53a88"
[2]=>
string(39) "XT-6a42ab94-9124-4c44-bbc2-5f56c6fcfd99"
[3]=>
int(4367604)
[4]=>
string(10) "1686022107"
}
java代码
public static void main(String[] args) throws IOException {
sha("4367604", "XT-6a42ab94-9124-4c44-bbc2-5f56c6fcfd99", "2321c578da9446215fcefe12adf6e2nb", "647ea7db53a88", "1686022107");
}
private static void sha(String... data) {
Arrays.sort(data);
System.out.println(Arrays.toString(data));
}
输出结果
[1686022107, 2321c578da9446215fcefe12adf6e2nb, 4367604, 647ea7db53a88, XT-6a42ab94-9124-4c44-bbc2-5f56c6fcfd99]
通过对比可以发现排序后的结果不一致
区别
PHP array
文档说明
sort(array &$array, int $flags = SORT_REGULAR): true
对 array 本身按照值(value)升序排序。
array
输入的数组。
flags
可选的第二个参数 flags 可以用以下值改变排序的行为:
排序类型标记:
SORT_REGULAR - 正常比较单元 详细描述参见 比较运算符 章节
SORT_NUMERIC - 单元被作为数字来比较
SORT_STRING - 单元被作为字符串来比较
SORT_LOCALE_STRING - 根据当前的区域(locale)设置来把单元当作字符串比较,可以用 setlocale() 来改变。
SORT_NATURAL - 和 natsort() 类似对每个单元以“自然的顺序”对字符串进行排序。
SORT_FLAG_CASE - 能够与 SORT_STRING 或 SORT_NATURAL 合并(OR 位运算),不区分大小写排序字符串。
JAVA Arrays.sort
对数组按照一定顺序排列,默认为升序
原因
因为Java
是强类型语言,所以数组里面的元素要统一类型,上述Java
代码表明对字符串数组进行升序排序,而PHP
数组的第一个元素的类型是数字,其余是字符串,sort
函数默认排序类型为SORT_REGULAR
,因此两边排序的结果不一样
解决办法
在PHP
的sort
函数第二个参数传入SORT_STRING
,把数组的元素当作字符串来比较
$arr = [4367604, 'XT-6a42ab94-9124-4c44-bbc2-5f56c6fcfd99', '2321c578da9446215fcefe12adf6e2nb', '647ea7db53a88', '1686022107'];
sort($arr, SORT_STRING);
var_dump($arr);
array(5) {
[0]=>
string(10) "1686022107"
[1]=>
string(32) "2321c578da9446215fcefe12adf6e2nb"
[2]=>
int(4367604)
[3]=>
string(13) "647ea7db53a88"
[4]=>
string(39) "XT-6a42ab94-9124-4c44-bbc2-5f56c6fcfd99"
}