/** * */ package jframe.core.util; import java.util.Arrays; /** * @author dzh * @date Sep 27, 2013 9:49:36 AM * @since 1.0 */ public class MathUtil { /** * * @param nums * @return a unused minimal natural number */ public static final int calcMinNum(int[] nums) { if (nums == null || nums.length == 0) return 1; Arrays.sort(nums); int min = 1; for (int i = 0; i < nums.length; i++) { if (nums[i] - min == 0) { ++min; continue; } break; } return min; } // public static final int calcMinNum(Collection<Integer> nums) { // int sum = 0; // for (int n : nums) { // sum += n; // } // // int n = nums.size(); // int sum_min = ((n + 1) * n) / 2; // if (sum == sum_min) // return n + 1; // // int x_min = n - (sum - sum_min) + 1; // if (x_min < 1) // x_min = 1; // int x_max = n + (sum - sum_min); // // int x = x_min; // while (x <= x_max) { // if (!nums.contains(x)) // TODO // break; // x++; // } // // return x; // } /** * TODO 未使用,优化 * * @param str * @return string hash code */ public static final int calcHash(String str) { int h = str.hashCode(); h ^= (h >>> 20) ^ (h >>> 12); return h ^ (h >>> 7) ^ (h >>> 4); } public static final int calcCheckSum(byte[] bytes, int num) { return calcCheckSum(bytes, 0, bytes.length, num); } /** * 每次取num个byte位取反相加; 次数间异或 * * @param bytes * @param num * 每次从bytes中取num个byte * @return */ public static final int calcCheckSum(byte[] bytes, int offset, int length, int num) { int cs = Integer.MAX_VALUE; for (int i = offset; i < length; i += num) { int sum = 0; int loc = 0; for (int n = 0; n < num; n++) { // loc = i + n; if (loc > offset + length || loc >= bytes.length) break; sum += (bytes[i + n] & 0xff); } cs ^= sum; } return cs; } public static final int calcCheckSum(byte[] bytes) { return calcCheckSum(bytes, 1); } }