精华内容
下载资源
问答
  • 前言之前收到一个需求,甲方说,他们想给用户生成一个唯一的邀请,然后用户量在xxx之类的,例如我这里就随便说个5kw个吧。这个嘛,听起来都觉得挺简单的,毕竟每个用户基本上都有自己的唯一用户id,用那个来生成就...

    前言

    之前收到一个需求,甲方说,他们想给用户生成一个唯一的邀请码,然后用户量在xxx之类的,例如我这里就随便说个5kw个吧。这个嘛,听起来都觉得挺简单的,毕竟每个用户基本上都有自己的唯一用户id,用那个来生成就好。

    首先,用户体验方面,肯定是大写字母跟数字(如果再体验好一点的,就把数字的 0/1 以及字母O去掉),反正我是偷懒了,用36个字符(A-Z0-9),也就是“Q7VBNYR1HSCUEODIX3K95F48L0P6GAMTWJZ2",至于为啥是乱的,自己去想想吧,反正我是觉得不连贯就好

    初阶版本(被喷版,直接用ID来生成)

    简单,有用户id嘛,如果用户id是从小的数字开始,那么就直接就除法取整跟取模来做,不够位数就直接补0就好。美滋滋。

    private String runMethod1(long id) {

    String base = "Q7VBNYR1HSCUEODIX3K95F48L0P6GAMTWJZ2";

    char[] cs = new char[6];

    for (int i = 0; i < 6; i++) {

    cs[i] = base.charAt((int) (id % 36));

    id = id / 36;

    }

    return new String(cs);

    }

    @Test

    public void method1() {

    for (int i = 0; i < 10; i++) {

    System.out.println(String.format("id=%d\t code=%s", i, runMethod1(i)));

    }

    }

    测试效果:

    706ae634bce8e2ab1da26331914efc4d.png

    好了,完成了。不用我多说,肯定很多人第一感觉就是,我想它们再乱点~这个太有规律性了

    进阶版本–1(随机字符+db唯一性验证)

    看到上面的版本,肯定是不连一个有所追求的程序猿都觉得容忍不了的,毕竟太有规律,一下子就猜到。

    好了,没规律是吧,于是就暴力解决

    1、随机生成指定长度的字符串(如我这里是6个)

    2、用数据库(聪明点的会用redis)来进行唯一性判断

    3、步骤2判断成功,就输出,否则就回到步骤1.

    嗯,其实这个做法也不错,也没啥大毛病。毕竟我一开始就说这么做的。问题也没啥,一般情况下这个可以满足绝大部分的甲方需求。代码就略了,说得那么清楚,自己写去吧。

    进阶版本–2 (用户id)

    这个版本,其实就说初阶版本的一个升级。

    首先,字符太连贯对吧,解决方法就是我取不同的基础字符串来生成就好啦。于是,我改进成:

    邀请码的第一个字符,当做指定基础字符串标记。

    邀请码第二到第六 就是简单的一个流水号生成规则。

    于是,我就一口气生成了36串无序的字符串

    public static void main(String[] args) {

    String str = "QWERTYUIOPASDFGHJKLZXCVBNM0123456789";

    for (int i = 0; i < 36; i++) {

    char[] cs = str.toCharArray();

    String array = "";

    int size = 0;

    while (size < str.length()) {

    int index = (int) (Math.random() * str.length());

    if (cs[index] != '-') {

    array += cs[index];

    cs[index] = '-';

    size++;

    }

    }

    System.out.println(array);

    }

    }

    然后,一个个方到一个list里面。

    注意,这里是直接在static中写进去。

    private static List baseList;

    private static final String INDEX = "4NQ5XMV7WRKC0ILEZO2J1PSDH8AU3FBTG6Y9";

    static {

    List list = new ArrayList<>();

    list.add("XLG27OR1QC34FK58JAMPEH9YWU0SZNIDVB6T");

    list.add("W8DCRPJKYL0FE5QTIVZB6O3X1HUN92SGA47M");

    list.add("07YHDTEK4NVBQRUZPSGI93C81O2AWJ6FXML5");

    list.add("QWID3F97N1KY2SZXVUE4LORACB8TJ50G6HMP");

    list.add("AYZQ8GVJR7PHS501B4CONL26X3WUK9TEFDIM");

    list.add("SMCIQ4F3RWH56V8NA7TJOB1ZULD29KGY0PEX");

    list.add("KI835MZWALV7DGP2JO041XHCQYEB9UF6TNRS");

    list.add("4NQ5XMV7WRKC0ILEZO2J1PSDH8AU3FBTG6Y9");

    list.add("3VPDTRGM0NUAEH7SW6945OIFC82BYZLXJK1Q");

    list.add("DEH1MXNC6IULY3K9GPT4WQJVR08B5FSA27OZ");

    list.add("PZ6WUQDT2MEIHA9Y8RKBL34XGFVSJN7OC150");

    list.add("7KEDTSVQURXIBJ816Y29LOPCNF0G35WZMAH4");

    list.add("JHOF7BVZ0ET1DWGX4Q3APCLRMI895K2UY6SN");

    list.add("80UVJDY3IXA15TP69ZFEHC7QMLGBKSWN2RO4");

    list.add("4653QA9NLIZCSJKTEPV2DU7BOGXF18MYH0RW");

    list.add("SOGYRP3TWH8ZJBI6U4KN7X2DFA0QC5VEL1M9");

    list.add("1S4YA6KNTZIXEC25P03JGOQUMBWRHL987DVF");

    list.add("NJMXCUTGO7ZL016SWPR8YHEVABKFI423D5Q9");

    list.add("CT02U35L1RH84FPKMGWJVYNBIZ7DE6SXAOQ9");

    list.add("2U06HM7TWP1YIBX49SZFEAR8D5QGKO3JVNCL");

    list.add("ABERN67VO40DFPJYS9H5KW21Z8M3CILGXUTQ");

    list.add("QP43YJ2ZKA81F7TCSXH6V0BRGEMWLDNO9U5I");

    list.add("0R7QKXBW3VLPHE48U1Z9DJYNAFTOCIMS56G2");

    list.add("0C4XVG98NM71HBUDQYZLFRE65SIPKOT23WAJ");

    list.add("T7YRN3LHWZJGBI4S2FM8UQP0DK69VXCO5EA1");

    list.add("D2MR7059AGWTSJP8EKUHXLQ6BFZONIVC134Y");

    list.add("MPB3SQOEU9XLV2R1Y6ZTHGKD8AF50JI4N7CW");

    list.add("73X4LRF52JC0OETVHMKUNPDI1SQ8BZ6AWY9G");

    list.add("GF9ASJP2V4HE5LOTY0R1I3C8MUNXW7BKDQ6Z");

    list.add("J3BLZDY7VGNWSKX0CP4MU18FQ5EHROAI629T");

    list.add("LTMR0UFP28BJ1OSWXV5G3AN4EKCQYH76IZD9");

    list.add("MDL7E8TWYS2PI6A3ZXBVJH9OKGQ510RCU4NF");

    list.add("L2K3WMCBQ6GUDFYZ810XSP4O7RIH59AVNTJE");

    list.add("DLPBXJ0ROH8AFINQUSME1246VC3T9YZK5G7W");

    list.add("7CHVSGR1ZEJDMXPF9OY0KT35I6NBLAQ4W28U");

    list.add("X4V3G9SIET678NUK0FM1BZDYLR2OJC5QWAPH");

    baseList = Collections.unmodifiableList(list);

    }

    public static String genInviteCode(long id) {

    int key = (int) (id % 36);

    char[] cs = new char[6];

    cs[0] = INDEX.charAt(key);

    String select = baseList.get(key);

    long code = 1_0000_0000 + id * 13;

    for (int i = 1; i < 6; i++) {

    cs[i] = select.charAt((int) (code % 36));

    code = code / 36;

    }

    return new String(cs);

    }

    @Test

    public void test() {

    for (int i = 0; i < 10; i++) {

    System.out.println(String.format("id=%d\t code=%s", i, genInviteCode(i)));

    }

    }

    88afcb22a7ee9a3524061d3c46929767.png

    哈哈,这样看起来就美滋滋了,甲方估计就不容易看出来了。这样做就能省了不少访问db/redis的时间,效率也优化了(优化个毛线,一个角色就开始的时候会创建一次邀请码,这个所谓的效率优化都可以无视)

    然后,聪明的小伙伴就会发现,这样子弄的话 那么就会每隔36个邀请码,它们的相似度就比较高了。

    解决方式有好多,例如你用2个邀请码来做这个标记(我这里是用1位),至于数量够不够,也是你要考虑的一个方向了。

    这里仅仅是晚上无聊,想想这个东西有没有别的生成方式才搞出来的。

    谢谢支持

    展开全文
  • 根据用户id生成一个唯一邀请

    千次阅读 2021-03-08 05:19:44
    需求描述:根据用户id生成与之对应的唯一邀请,范围为‘0-9A-Z’。这个需求的重点在于加粗的部分,也就是要能够根据邀请反推出用户ID,这样邀请就不用入库了,在用户量很大的情况下,性能可以得到不小的提升。...

    需求描述:根据用户id生成与之对应的唯一邀请码,范围为‘0-9A-Z’。

    这个需求的重点在于加粗的部分,也就是要能够根据邀请码反推出用户ID,这样邀请码就不用入库了,在用户量很大的情况下,性能可以得到不小的提升。

    错误思路

    随机生成一个字符串,再将用户id拼接到字符串后面,但是这样id就太明显了,容易暴露,而且如果id很长的话,会导致邀请码很长,不利于用户使用。

    所以可以将用户id插入到生成的字符串中,隔一个字符插入一个id的数字,这样id混合在字符串中,不容易暴露,但是长度问题并没有得到优化,于是把隔一个字符插入一个id的数字改为隔一个字符插入两个id的数字。然而长度好像并没有受到太大的影响。

    正解

    思考:一个10进制的数字短还是一个16进制的数字短?

    肯定是16进制相对短一些,所以我们可以直接把用户id转成10+26=36进制的不就可以了吗?具体代码如下:

    function createCode($user_id)

    {

    static $source_string = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';

    $num = $user_id;

    $code = '';

    while($num)

    {

    $mod = $num % 36;

    $num = ($num - $mod) / 36;

    $code = $source_string[$mod].$code;

    }

    return $code;

    }

    邀请码保证了唯一性,并且长度不会太长,用户id也能够根据邀请码反推出来,但是有一点不好的是,别人也可以根据邀请码去反推出user_id,因此,我们需要做一些优化。

    优化

    把0剔除,当做补位符号,比如小于四位的邀请码在高位补0,这样36进制就变成了35进制,然后把字符串顺序打乱,这样,在不知道$source_string的情况下,是没办法解出正确的user_id的。

    代码如下:

    function createCode($user_id) {

    static $source_string = 'E5FCDG3HQA4B1NOPIJ2RSTUV67MWX89KLYZ';

    $num = $user_id;

    $code = '';

    while ( $num > 0) {

    $mod = $num % 35;

    $num = ($num - $mod) / 35;

    $code = $source_string[$mod].$code;

    }

    if(empty($code[3]))

    $code = str_pad($code,4,'0',STR_PAD_LEFT);

    return $code;

    }

    这样,对应user_id的唯一邀请码就生成了,再附一个解码函数:

    function decode($code) {

    static $source_string = 'E5FCDG3HQA4B1NOPIJ2RSTUV67MWX89KLYZ';

    if (strrpos($code, '0') !== false)

    $code = substr($code, strrpos($code, '0')+1);

    $len = strlen($code);

    $code = strrev($code);

    $num = 0;

    for ($i=0; $i < $len; $i++) {

    $num += strpos($source_string, $code[$i]) * pow(35, $i);

    }

    return $num;

    }

    展开全文
  • 自增序号、唯一ID、唯一编码生成器 1、序号发生器生成唯一编码 import com.github.pagehelper.util.StringUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data....

    自增序号、唯一ID、唯一编码生成器

    1、序号发生器生成唯一编码

    import com.github.pagehelper.util.StringUtil;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.stereotype.Component;
    import java.util.List;
    
    @Component
    public class SeqGeneratorUtil {
        @Autowired
        private StringRedisTemplate redisTemplate;
        /**
         * 自增序列号
         * prefix 前缀
         * numLength 要生成多少位的数字
         */
        public String SeqGenerator(String prefix, int numLength) {
            String upperCode = "";
            Long size = redisTemplate.opsForList().size(prefix);//查找以prefix作为key值的数据长度
            if (size > 0) {//有数据
                List leve = redisTemplate.opsForList().range(prefix, 0, -1);//获取该key下面的所有值 (-1所有值;1下一个值)
                 upperCode = Collections.max(leve).toString();//返回最大值
            }
            String returnCode = "";
            int Suffix;//后缀数字
            if (!StringUtil.isEmpty(upperCode)) {//有数据
                String sequence = upperCode.substring(prefix.length());//截取前缀开始的后面数字
                Suffix = Integer.parseInt(sequence);
                Suffix++;//最后的序号加一
            } else {//没有数据
                Suffix = 1;
            }
            returnCode = prefix + String.format("%0" + numLength + "d", Suffix);//后缀不够numLength长,前面补充0
            redisTemplate.opsForList().rightPush(prefix, returnCode);//存入Redis
            return returnCode;
        }
    }
    
    

    2、利用redis的incr生成唯一编码

    展开全文
  • 如下所示: public String next() { long appBootTimes = systemVariableService.... 这篇快速解决code唯一码(java)的简便方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

    如下所示:

    public String next() {

    long appBootTimes = systemVariableService.getAppBootTimes();

    return Long.toString(appBootTimes * 10000000000000000l + seq.incrementAndGet(), Character.MAX_RADIX);

    }

    解释:找数据库中的最近新增的账号

    public String nextNo() {

    return Long.toString(seq.incrementAndGet());

    }

    public String nextTradeNo() {

    return "T" + LocalDate.now().format(DateTimeFormatter.ofPattern("uuuuMMdd")) + next();

    }

    public String nextFileName(String suffix) {

    return LocalDate.now().format(DateTimeFormatter.ofPattern("uuuuMMdd")) + "/" + UUID.randomUUID() + (StringUtils.isNotBlank(suffix) ? ("." + suffix) : "");

    }

    public String nextPurchaseNo(){

    return "PO"+LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")) + "-" + systemVariableService.getPurchaseNumbers("PO");

    }

    public String nextSalesNo(){

    System.out.println(systemVariableService.getSalesNumbers("SO"));

    return "SO"+LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")) + "-" + systemVariableService.getSalesNumbers("SO");

    }

    public String nextReceiptNo(){

    return "SI"+LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")) + "-" + systemVariableService.getReceiptNumbers("SI");

    }

    public String nextLoadingListNo(){

    return "LL"+LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")) + "-" + systemVariableService.getLoadingListNumbers("LL");

    }

    public String nextDeliverNo(){

    return "DL"+LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")) + "-" + systemVariableService.getDeliverNumbers("DL");

    }

    public String nextOtherInNo(){

    return "OI"+LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")) + "-" + systemVariableService.getOtherInNumbers("OI");

    }

    public String nextOtherOutNo(){

    return "OO"+LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")) + "-" + systemVariableService.getOtherOutNumbers("OO");

    }

    public String nextPromotionNo(){

    return "HD"+LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")) + "-" + systemVariableService.nextPromotionNo("HD");

    }

    public String nextBalanceFeeNo() {

    return "FT" + systemVariableService.getBalanceFeeNumbers();

    }

    以上的方法,都比较的好用和方便。其实这些我都要百度,是同事写的,真强!

    这篇快速解决code唯一码(java)的简便方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

    展开全文
  • 根据用户id生成与之对应的唯一邀请,范围为‘0-9A-Z’。这个需求的重点在于加粗的部分,也就是要能够根据邀请反推出用户ID,这样邀请就不用入库了,在用户量很大的情况下,性能可以得到不小的提升。错误思路...
  • PHP生成唯一邀请

    2021-06-29 17:58:36
    需求是每个用户都有个邀请,邀请字母数字组成的10位字符串,首先想到的就是生成随机字符串了,如下 public function createNonceStr($length = 16) { $chars = '...
  • 一个简单的(未经测试,使用风险自负)可能有效的解决方案是为每个线程维护每个方法的计数器:private static final ConcurrentHashMap>COUNTERS = new ConcurrentHashMap<>();public static int ...
  • declare(strict_types=1);.../*** Class InviteCode* 邀请码生成类* @link https://gist.github.com/guanguans/52b9136e86c1a86ab0d51747e841537d* @link https://www.albinwong.com/6x174dD7ZyjPQvpX.html* @l...
  • function create_invite_code() { $code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; $rand = $code[rand(0,25)] .strtoupper(dechex(date('m'))) .date('d') .substr(time(),... 如果存在,就重新生成一个,直到不重复,再保存。
  • js生成唯一标识符(即唯一码
  • js 生成16位随机唯一id

    2021-05-28 14:28:07
    export const RandomId = (n: number) => { var str = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K', 'L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z...
  • std::string getNewGuid() { GUID guid; ::CoCreateGuid(&guid); const int len = 36; char dst[len];... "%08x%04x%04x%02x%02x%02x%02x%02x%02x%02x%02x", guid.Data1, guid.Data2, gu...
  • 生成唯一邀请.html

    2021-06-13 05:16:43
    Documentlet sourceString = 'ZDOWGVJ5ASB3IRP9QM41EYFCU2TN76XH0KL';//三十五进制字符串长度不足8,用数字8高位补全function enCodeID(userId) {//编码userId += 100000000;let num = parseInt(userId);...
  • 首页专栏java文章详情2使用唯一id,生成唯一字符串订单号,唯一邀请唯一字符串,并可以反序列化原id吃馍夹菜发布于 2020-11-12Hashids包用来把整数生成唯一字符串(比如:通过加密解密id来隐藏真实id)generate short...
  • 方法很简单,使用函数如下: functionguid(){ return'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g,function(c){ varr=Math.random()*16|0, v=c=='x'?r:(r&...returnv.toString...
  • 新建文件app/Services/InviteCodeService....// 邀请服务class InviteCodeService{protected $key,$num;public function __construct(){$this->key = 'abcdefghjkmnpqrstuvwxyz123456789';// 注意这...
  • ------ 根据用户id生成与之对应的唯一邀请,范围为‘0-9A-Z’。这个需求的重点在于加粗的部分,也就是要能够根据邀请反推出用户ID,这样邀请就不用入库了,在用户量很大的情况下,性能可以得到不小的提升。 &...
  • 生成8位或16位唯一标识

    千次阅读 2021-03-10 06:20:49
    import java.util.UUID;public class InviteCodeGenerator{public static String[] chars36 = new String[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "...
  • php生成唯一码,唯一标识: 开箱即用,上代码: function uuid($length=10) { // fix for compatibility with 32bit architecture; each mt_rand call is restricted to 32bit // two such calls will cause 64...
  • 一种分布式的取件码生成方法技术

    千次阅读 2021-01-14 15:23:46
    【技术实现步骤摘要】本专利技术涉及样品柜取件码生成,特别涉及一种分布式的取件码生成方法。技术介绍在快递柜的领域中,快递员进行快件派送的时候,通常会遇到收件人无法立刻来取件的情况,这样就需要快递员先把...
  • mysql唯一编号生成

    2021-07-16 16:54:06
    I want to generate a unique random integer (from 10000 to 99999) identity just by clean mySQL; any ideas?I don't want to generate this number in php by cycling (generate number -&... check it in datab...
  • 通用全局唯一ID生成器前言全局唯一生成器在很多场景下需要,例如,sharding时。下面介绍几种方法来解决这个问题。双db方案flickr开发团队在2010年撰文介绍了flickr使用的一种主键生成测策略,同时表示该方案在flickr...
  • UUID是由一组32位数的16进制数字所构成,是故UUID理论上的总数为16^32=2^128,约等于3.4 x 10^38。... 像Java和Python都有专门库函数生成UUID,PHP也有第三方库可以用来生成UUID。 安装我们使用composer来安装uuid库...
  • 但在编码位数有限(比如:8位的邀请)和已有大量邀请数据的情况下,上述做法将逐步造成邀请码唯一生成的概率低下,最终因不停的循环查库导致程序超时或失败! 那么有没有一种邀请生成方式不需要进行数据库...
  • 一个简单的(未经测试,使用风险自负)可能有效的解决方案是为每个线程维护每个方法的计数器:private static final ConcurrentHashMap>COUNTERS = new ConcurrentHashMap<>();public static int ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 297,001
精华内容 118,800
关键字:

唯一码生成