生成随机id对比

生成随机id

最近公司的项目游戏生成的随机不重复id,重复概率有点大,

代码如下:

 1     private static int id = 0;
 2     public static int serverID = 0;
 3     private static final Object obj = new Object();
 4
 5     public static long getId1() {
 6         synchronized (obj) {
 7             id += 1;
 8             return (serverID & 0xFFFF) << 48 | (System.currentTimeMillis() / 1000L & 0xFFFFFFFF) << 16 | id & 0xFFFF;
 9         }
10     }

我做了一个性能测试

测试代码如下

 1     public static void main(String[] args) {
 2         HashSet<Long> longs = new HashSet<>();
 3         int lcount = 0;
 4         long starts = System.currentTimeMillis();
 5         int fcount = 100000;
 6         for (int i = 0; i < fcount; i++) {
 7             long id = getId1();
 8 //            long id = getId2();
 9             if (!longs.add(id)) {
10                 lcount++;
11             }
12         }
13         long stops = System.currentTimeMillis();
14         System.out.println("生产次数:" + fcount + " 成功生产次数:" + longs.size() + " 重复次数:" + lcount + " 耗时: " + (stops - starts));
15     }

测试生成次数和时间,

生产次数:100000 成功生产次数:65536 重复次数:34464 耗时: 18

经过测试,这段代码支持99999组服务器同时生成id,保证不重复,但是前提条件是每一秒生成次数不超过65536个,
而且在不同服务器产生重复概率还是有点高,优点就是生产速度快,重复概率相对较低。缺点就是每一秒生成的数量有限,且不同服务器id会产生相同的id

我在园友的博客里面发现了另外一种方式

    public static long getId2() {
        String toString = UUID.randomUUID().toString();
        byte[] bytes = toString.getBytes();
        long num = 0;
        for (int ix = 0; ix < 8; ++ix) {
            num <<= 8;
            num |= (bytes[ix] & 0xff);
        }
        return num;
    }

根据uuid生成long型随机数,重复概率极低

生产次数:100000 成功生产次数:99999 重复次数:1 耗时: 579

看看这个结果,重复概率极低,极低,但是耗时相对较长,但也还算是在接受范围内。

这个耗时加上了hashset的判断耗时。

如果抛开hashet判断会减少100多毫秒的生成时间;

时间: 2024-10-07 00:38:29

生成随机id对比的相关文章

mysql生成随机id

MySQL中生成随机ID的函数是UUID(),但是这样生成出来的随机ID是36位带[-]符号的. SELECT UUID(); -- 37747019-90a2-11e9-9806-00505683703f 我们可以配合REPLACE()函数替换掉[-]符号来生成32位的不带[-]符号的随机ID. SELECT REPLACE(UUID(), '-', ''); -- 62d1556390a211e9980600505683703f 我们也可以配合UPPER()函数将小写字母转换为大写. SEL

动态生成随机背景色表格

<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>动态生成随机背景色表格</title> <style> table{margin-top:20px;width:800px;border:1px solid #ddd;border-collapse:collapse;} td{border:1px solid #ddd;padding:

在JSP中动态生成随机验证码,登录时后台校验验证码,以及如何避免同一个验证码被重复提交爆破密码

只需几步就可以生成动态随机的验证码,最终效果如下图: 一 前台显示页面login.jsp 其中验证码显示的是一张图片,链接指向的是生成验证码的servlet,同时点击图片后触发changeImg()这个js函数,使其动态生成一个新的验证码,这个函数中的参数t=Math.random()并不会参与验证码的生成,它的作用仅仅只是表示每次提交的并不是同一个请求,需要单独处理,完整的login.jsp代码如下: <%@ page language="java" contentType=&

HTML5+CSS3鼠标移入移出图片生成随机动画

今天分享使用html+css3+少量jquery实现鼠标移入移出图片生成随机动画,我们先看最终效果图(截图为静态效果,做出来可是动态的哟) 左右旋转 上下移动 缩放 由于时间关系我就不一步步解析各段代码所代表含义,我这里就给出一些思路及关键代码: 1.首先使用ul li展现4张图片 本示例中不仅使用了图片,在图片表面还放置了一段“WEB”字样文字,用于与图片实现隐藏或显示效果,故html中每张图片上方加入: <div class="mytext">WEB</div&g

android 客户端生成随机验证码的实现

由于项目中要用到验证码,自己找了些资料,试着就把这个验证码给做了出来,代码不是很多,比较的简单,下面给大家看看我是怎么实现该功能的: 源码地址下载:http://download.csdn.net/detail/u014608640/7268905 首先当然是写XML咯,贴上代码 <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" andr

生成随机验证码

生成随机验证码实例 import random a=[] c ='' for i in range(6): if i == random.randrange(1,4): a.append(str(random.randint(1,9))) else: temp = random.randint(65,90) a.append(chr(temp)) print a b="".join(a) print b for i in a: c += str(i) print c 输出为 ['D',

android生成随机汉字

生成随机汉字 最近在项目中用到了一个功能,就是要生成随机汉字,想到很多人使用的很少,但是要用的时候确实又不知道从何入手,那么今天我将把这段代码分享出来,供大家参考学习,可以用作工具类,供及时之需: /** * 生成随机汉子 * @return */ private char getRandomChar() { String str = ""; int hightPos; int lowPos; Random random = new Random(); hightPos = (176

封装各种生成唯一性ID算法的工具类

/** * Copyright (c) 2005-2012 springside.org.cn * * Licensed under the Apache License, Version 2.0 (the "License"); */ package com.minxinloan.common.utils; import java.security.SecureRandom; import java.util.UUID; /** * 封装各种生成唯一性ID算法的工具类. * @aut

Android生成随机验证码技术

在Android客户端应用开发中,往往需要短信验证码或者随机验证码来限制用户的操作或者认证.短信验证码是为了对用户进行认证,主要通过Http协议等通信协议实现;随机验证码很大程度是为限制或者提示用户相关操作.随机验证码的验证主要有两种方式:请求服务器验证,本地验证.比如,在用户向服务器发送登录请求,我们通过随机验证码(本地验证即可)限制用户随意按请求按钮,演示如下: 源码实战 (1)src/.../createCode.java 功能:使用Random.Canvas.Paint及其相关方法创建包