dedecms 购物网站,书签制作手工,四川发布干部任前公示,wordpress主题安装教程要求 不重复随机11位数字不占存储我们都知道11位数字(random)对应有最大值max和最小值min99999999999和10000000000.很简单的从最小值开始按顺序分发到最大值#xff0c;就满足了不重复#xff0c;不占存储#xff0c;11位数字的特性。那么接下来就要考虑如何生成随机数字这…要求 不重复随机11位数字不占存储我们都知道11位数字(random)对应有最大值max和最小值min99999999999和10000000000.很简单的从最小值开始按顺序分发到最大值就满足了不重复不占存储11位数字的特性。那么接下来就要考虑如何生成随机数字这个特性 如何随机 可以考虑将上面分发的11位id数字进行二进制打乱就可以生成随机数字啦。但是呢打乱后的数字长度可能低于11位或者高于11位那么如何有心机的进行二进制打乱才能保证固定11位呢。 11位数字(random) 不小于min 很自然的可以想到id从0到max-min分发再打乱再加上min肯定不会小于min但是可能会大于max。 id数字特性 random:是要生成的随机数字 id:是顺序分发的数字 minrandommax minminidmax 0idmax-min
复制代码11位数字(random) 不大于max 可以先观察一下max-min对应的二进制 1010011110100011010110000001111111111 如何进制顺序打乱不超过max-min对于上面二进制除高位之外的第一个为1的位之后取最大值即上述二进制变为max_diff 1001111111111111111111111111111111111 这样打乱顺序前三位保持不变后面打乱就可以不超过max-min.我这里是低8位和除去前三位的高八位交换的。 使用率 变化后的二进制的使用率有: max_diff/(max-min)85899345919/8999999999995.4% The code public class ShortChainUtils {private static final long MIN 10000000000L;private static final long SUFFIX_ID ((1L 34) - 1);private static final long PRE_ID (7L 34);private static final long MAX_ID 85899345919L;public static long next(long id) {if (id 0 || id MAX_ID) {throw new IllegalArgumentException(Illegal id: id);}// 非线性id swap(id, 7, 0);id swap(id, 6, 1);// Id后34位long value id SUFFIX_ID;// Id后34位的最低八位和高1-9位交换value (((value 8) | ((value 255) 26)));// Id前3位|Id后34位id (id PRE_ID) | value;// 加上最小值, 保证生成的11位id MIN;return id;}/*** xxxx xxxx xxxx x0xx xxxx xx0x xxxx xxxx|0000 0000 0000 0b00 0000 00a0* 0000 0000*/private static long swap(long value, int x, int y) {return (value (~(1 x)) (~(1 y))) | (((value x) 1) y) | (((value y) 1) x);}private ShortChainUtils() {};public static void main(String[] args){Set set new HashSet();for(int i0;; i) {long id ShortChainUtils.next(i);System.out.println(id ---i);if(set.contains(id)){System.out.println(duplicated);break;}set.add(id);}}复制代码不重复id 对于不重复id的分发可以参考 自增ID的实现 总结 该随机数字算法生成简单效率高容易扩展比如你想生成8位9位可以用类似方法不用记录已生成数字去重。 另外还要注意一点的是要想随机数字不重复重点是ID分发不重复。