我正在修复生成条形码的java代码中的错误(线程问题).根据设计,条形码只是一个数字,下一个“未使用”条形码是序列中的下一个.有990亿可能的数字.

首先,由于安全问题,我不喜欢自动递增的数字.我想生成随机数.

已使用的条形码存储在数据库表中.

如果条形码正在使用中,则可以很容易地创建随机数并检查表格.但逻辑必须循环,直到找到一个未使用的随机数.到时候这可能是一项艰巨的任务.

我认为具有1000个免费条形码的线程安全缓存可以完成这项工作,但构建或更新缓存可能非常繁重.

对查询设计的任何建议或者可以返回一系列免费随机数的查询?

我正在使用hibernate标准.

谢谢

解决方法:

您可以使用Linear Feedback Shift Register.它们可以在一个周期中逐步执行具有特定位数的所有数字,而不会重复,但是看似随机的顺序.

这应该工作 – 这是我刚才写的一个严重削减的版本.您将必须选择链接中描述的原始多项式.

您可以找到随机选择的原始多项式列表here.

/**

* Linear feedback shift register

*

* Taps can be found at:

* See http://www.xilinx.com/support/documentation/application_notes/xapp052.pdf

* See http://mathoverflow.net/questions/46961/how-are-taps-proven-to-work-for-lfsrs/46983#46983

* See http://www.newwaveinstruments.com/resources/articles/m_sequence_linear_feedback_shift_register_lfsr.htm

* See http://www.yikes.com/~ptolemy/lfsr_web/index.htm

* See http://seanerikoconnor.freeservers.com/Mathematics/AbstractAlgebra/PrimitivePolynomials/overview.html

*

* @author OldCurmudgeon

*/

public class LFSR implements Iterable {

// Bit pattern for taps.

private final BigInteger taps;

// Where to start (and end).

private final BigInteger start;

// The poly must be primitive to span the full sequence.

public LFSR(BigInteger primitivePoly, BigInteger start) {

// Where to start from (and stop).

this.start = start.equals(BigInteger.ZERO) ? BigInteger.ONE : start;

// Knock off the 2^0 coefficient of the polynomial for the TAP.

this.taps = primitivePoly.shiftRight(1);

}

@Override

public Iterator iterator() {

return new LFSRIterator(start);

}

private class LFSRIterator implements Iterator {

// The last one we returned.

private BigInteger last = null;

// The next one to return.

private BigInteger next = null;

public LFSRIterator(BigInteger start) {

// Do not return the seed.

last = start;

}

@Override

public boolean hasNext() {

if (next == null) {

/*

* Uses the Galois form.

*

* Shift last right one.

*

* If the bit shifted out was a 1 - xor with the tap mask.

*/

boolean shiftedOutA1 = last.testBit(0);

// Shift right.

next = last.shiftRight(1);

if (shiftedOutA1) {

// Tap!

next = next.xor(taps);

}

// Never give them `start` again.

if (next.equals(start)) {

// Could set a finished flag here too.

next = null;

}

}

return next != null;

}

@Override

public BigInteger next() {

// Remember this one.

last = hasNext() ? next : null;

// Don't deliver it again.

next = null;

return last;

}

@Override

public void remove() {

throw new UnsupportedOperationException("Not supported.");

}

@Override

public String toString() {

return LFSR.this.toString()

+ "[" + (last != null ? last.toString(16) : "")

+ "-" + (next != null ? next.toString(16) : "") + "]";

}

}

@Override

public String toString() {

return "(" + taps.toString(32) + ")-" + start.toString(32);

}

}

public void test(int[] tap, int base) {

System.out.println("Test: " + Arrays.toString(tap));

// Build the BigInteger.

BigInteger primitive = BigInteger.ZERO;

for (int bit : tap) {

primitive = primitive.or(BigInteger.ONE.shiftLeft(bit));

}

// Stop at 100.

int count = 100;

LFSR lfsr = new LFSR(primitive, BigInteger.ONE);

for (BigInteger b : lfsr) {

if (count-- > 0) {

System.out.println(b.toString(base));

} else {

break;

}

}

}

public void test() {

// Just 6 bits.

int[] tap7 = {6, 5, 0};

test(tap7, 10);

// An example 48-bit tap.

int[] tap48 = {48, 46, 45, 44, 42, 40, 36, 34, 33, 32, 29, 27, 26, 20, 17, 16, 12, 11, 10, 5, 3, 1, 0};

test(tap48, 16);

}

标签:java,database,multithreading

来源: https://codeday.me/bug/20190624/1276025.html

java项目生成多个条码_java – 生成随机条形码 – 一个设计问题相关推荐

  1. android 生成二维码_Java 生成二维码实战

    简介 ZXing 是一个开源 Java 类库用于解析多种格式的 1D/2D 条形码.目标是能够对QR编码.Data Matrix.UPC的1D条形码进行解码.其提供了多种平台下的客户端包括:J2ME. ...

  2. java生成条码_Java生成商品条形码

    之前没有使用过这个,现在使用JBarcode生成商品条形码,工作之前的准备工作: Eclipse: Eclipse Java EE IDE for Web Developers. Version: H ...

  3. java导出html word文档_java生成带html样式的word文件

    最近在项目中需要将通过富文本编辑器处理过的文字转换为Word,查了很久,大家通常的解决办法是使用Jacob或POI等组件直接生成Word,但是都无法将富文本编辑器处理过的文字保留样式并保存为Word, ...

  4. java 生成操作excel文件_Java生成和操作Excel文件

    AVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该API非Windows操作系统也可以通过纯 ...

  5. java md5加密32位小写_Java生成MD5的方法,简单封装并转为32位小写

    1 import java.security.MessageDigest; 2 3 public class MD5 { 4 5 public static String toMD5(String p ...

  6. java生成验证码工具类_Java生成图形验证码工具类

    生成验证码效果 validatecode.java 验证码生成类 package cn.dsna.util.images; import java.awt.color; import java.awt ...

  7. java前补零工具类_java生成编码工具类,不足补0

    ~~~~~ 小小工具类!你值得拥有 简单粗暴,直接上代码 import java.text.NumberFormat; /** * @author: Abner * @description: 编码工 ...

  8. java生成16位随机数_java中如何产生一个16位数字组成的随机字符串?谢谢各位了...

    展开全部 方法如下: Random ran=new random(); boolean flag=true; while(flag){ int a=ran.nextInt(99999999); int ...

  9. java生成文字与图片_java生成word(文字和图片)

    1.整体思路 利用xml模板,在模板中预留占位标识(${yourContent}),然后将xml转为ftl文件,通过Map传值填充对应的内容即可,word其实和html一样,也有自己的xml标签,表头 ...

最新文章

  1. SLA 99.99%以上!饿了么实时计算平台3年演进历程
  2. kettle中java组件_kettle系列-[KettleUtil]kettle插件,类似kettle的自定义java类控件
  3. YARN 任务执行报错:Caused by: java.io.IOException: Exceeded MAX_FAILED_UNIQUE_FETCHES; bailing-out
  4. 集算器并行处理大文本文件的示例
  5. 【C++grammar】析构、友元、拷贝构造函数、深浅拷贝
  6. 校验json格式_格式化展示,校验错误,编辑JSON,这几个JSON工具一定不能错过
  7. 基于Linux和MiniGUI的嵌入式系统软件开发指南(四)
  8. async python两个_Python多线程一览
  9. 采用Trench肖特基二极管,实现功率密度的显著提升
  10. EasyRecovery2022真正不收费的数据恢复软件
  11. 定罪了!“女版乔布斯”有可能入狱20年
  12. 用python实现加减乘除计算器
  13. pythonaot_热修复设计之AOT/JITdexopt 与 dex2oat (一)
  14. xcode8 上传app到appStore 遇到 error ITMS90096
  15. 浦东人大常委会副主任刘宇青一行莅临零数科技指导工作
  16. 使用fasttext完成文本处理及文本预测
  17. Directshow完整介绍
  18. 电磁兼容(EMC)测试
  19. c语言调试时出现的三种错误,C语言课件 第十四章 常见错误和程序调试
  20. 计算机系统 ahci模式,打开ahci模式后需要重装系统吗

热门文章

  1. 火狐开发----Web开发者工具
  2. 如何做机器学习模型质量保障及模型效果评测
  3. 程序员眼中的编程语言和操作系统
  4. uni-app--》什么是uniapp?如何开发uniapp?
  5. SQL中类型转换函数
  6. vue project vlog
  7. C语言程序设计-鸡兔同笼问题
  8. HTML 转 PDf 方法一 wkhtmltopdf.exe
  9. 解决node-sass下载失败问题
  10. 双鱼林php生成器,双鱼林php代码生成器 v2.0 完整版