import java.util.Arrays
import java.util.LinkedList
public class Guy
{
public static void recursionSub ( LinkedList<int[]>list, int count, int[] array, int ind, int start, int... indexs )
{
start++
if (start >count - 1)
{
return
}
if (start == 0)
{
indexs = new int[array.length]
}
for ( indexs[start] = indindexs[start] <array.lengthindexs[start]++ )
{
recursionSub (list, count, array, indexs[start] + 1, start, indexs)
if (start == count - 1)
{
int[] temp = new int[count]
for ( int i = count - 1i >= 0i-- )
{
temp[start - i] = array[indexs[start - i]]
}
list.add (temp)
}
}
}
public static void main ( String[] args )
{
int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }
LinkedList<int[]>list = new LinkedList<int[]>()
recursionSub (list, 3, array, 0, -1)
for ( int[] strings : list )
{
System.out.println (Arrays.toString (strings))
}
}
}
理解他的原理就好写了。
所有参数 排除 时间戳,按照字母顺序排序,然后连接起来 和 appKey 以及 appSercet 进行md5 运算。
排序可以使用 String []keys = map.keyset().toarray() 获取后使用 Collections 进行sort。
有个类似的,可以参考一下:
public static boolean signVerify(String appSecret,Map<String, String> params){Map<String, String> map=new HashMap<String, String>()
map.put("appSecret", appSecret)
for(String key:params.keySet()){
if(!key.equals("sign")){
map.put(key, params.get(key))
}
}
String sign=sign(map)
if(sign.equals(params.get("sign"))){
return true
}
return false
}
private static String toHexValue(byte[] messageDigest) {
if (messageDigest == null)
return ""
StringBuilder hexValue = new StringBuilder()
for (byte aMessageDigest : messageDigest) {
int val = 0xFF & aMessageDigest
if (val < 16) {
hexValue.append("0")
}
hexValue.append(Integer.toHexString(val))
}
return hexValue.toString()
}
/**
*
* @param params
* @return
*/
public static String sign(Map<String,String> params){
List<String> keys=new ArrayList<String>(params.keySet())
Collections.sort(keys)
String string=""
for(String s:keys){
string+=params.get(s)
}
String sign=""
try {
sign = toHexValue(encryptMD5(string.getBytes(Charset.forName("utf-8"))))
} catch (Exception e) {
e.printStackTrace()
throw new RuntimeException("md5 error")
}
return sign
}
private static byte[] encryptMD5(byte[] data)throws Exception{
MessageDigest md5 = MessageDigest.getInstance("MD5")
md5.update(data)
return md5.digest()
}
public static void main(String[] args) {
String appKey="key"
String appSecret="secret"
Map<String, String> params=new HashMap<String, String>()
params.put("appKey", appKey)
params.put("appSecret", appSecret)
params.put("date", new Date().getTime()+"")
String sign=sign(params)
params.put("sign", sign)
System.out.println(signVerify(appSecret, params))
}
package p1import java.util.Arrays
import java.util.LinkedList
public class Guy
{
public static void recursionSub ( LinkedList<int[]>list, int count, int[] array, int ind, int start, int... indexs )
{
start++
if (start >count - 1)
{
return
}
if (start == 0)
{
indexs = new int[array.length]
}
for ( indexs[start] = indindexs[start] <array.lengthindexs[start]++ )
{
recursionSub (list, count, array, indexs[start] + 1, start, indexs)
if (start == count - 1)
{
int[] temp = new int[count]
for ( int i = count - 1i >= 0i-- )
{
temp[start - i] = array[indexs[start - i]]
}
list.add (temp)
}
}
}
public static void main ( String[] args )
{
int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }
LinkedList<int[]>list = new LinkedList<int[]>()
recursionSub (list, 3, array, 0, -1)
for ( int[] strings : list )
{
System.out.println (Arrays.toString (strings))
}
}
}