部分功能的实现和算法

目录

1.雪花算法

2.MD5加密

3.小眼睛显示密码

4.发送验证码

5.倒计时


1.雪花算法

SnowFlake 中文意思为雪花,故称为雪花算法。最早是 Twitter 公司在其内部用于分布式环境下生成唯一 ID。在2014年开源 scala 语言版本

雪花算法的原理就是生成一个的 64 位比特位的 long 类型的唯一 id。

最高 1 位固定值 0,因为生成的 id 是正整数,如果是 1 就是负数了。
接下来 41 位存储毫秒级时间戳,2^41/(1000*60*60*24*365)=69,大概可以使用 69 年。
再接下 10 位存储机器码,包括 5 位 datacenterId 和 5 位 workerId。最多可以部署 2^10=1024 台机器。
最后 12 位存储序列号。同一毫秒时间戳时,通过这个递增的序列号来区分。即对于同一台机器而言,同一毫秒时间戳下,可以生成 2^12=4096 个不重复 id。

public class SnowflakeIdGenerator {private final long twepoch = 1626708222000L; // 设置起始时间戳,这里使用当前时间的毫秒值作为起始时间private final long workerIdBits = 10L;private final long sequenceBits = 12L;private final long maxWorkerId = -1L ^ (-1L << workerIdBits);private final long workerIdShift = sequenceBits;private final long timestampLeftShift = sequenceBits + workerIdBits;private final long sequenceMask = -1L ^ (-1L << sequenceBits);private long workerId;private long sequence = 0L;private long lastTimestamp = -1L;public SnowflakeIdGenerator(long workerId) {if (workerId > maxWorkerId || workerId < 0) {throw new IllegalArgumentException(String.format("Worker ID can't be greater than %d or less than 0", maxWorkerId));}this.workerId = workerId;}public synchronized long nextId() {long timestamp = timeGen();if (timestamp < lastTimestamp) {throw new RuntimeException("Clock moved backwards. Refusing to generate id for " + (lastTimestamp - timestamp) + " milliseconds");}if (lastTimestamp == timestamp) {sequence = (sequence + 1) & sequenceMask;if (sequence == 0) {timestamp = tilNextMillis(lastTimestamp);}} else {sequence = 0L;}lastTimestamp = timestamp;return ((timestamp - twepoch) << timestampLeftShift) |(workerId << workerIdShift) |sequence;}private long tilNextMillis(long lastTimestamp) {long timestamp = timeGen();while (timestamp <= lastTimestamp) {timestamp = timeGen();}return timestamp;}private long timeGen() {return System.currentTimeMillis();}// 示例用法public static void main(String[] args) {SnowflakeIdGenerator idGenerator = new SnowflakeIdGenerator(1); // 假设当前机器的worker id是1// 生成10个ID进行展示for (int i = 0; i < 10; i++) {long id = idGenerator.nextId();System.out.println("Generated Id: " + id);}}
}

2.MD5加密

MD5加密全程是Message-Digest Algoorithm 5(信息-摘要算法),它对信息进行摘要采集,再通过一定的位运算,最终获取加密后的MD5字符串。
  例如我们要加密一篇文章,那么我们会随机从每段话或者每行中获取一个字,把这些字统计出来后,再通过一定的运算获得一个固定长度的MD5加密后信息。因此,其很难被逆向破解。

MD5加密的特点:

MD5加密的特点主要有以下几点:
  1、针对不同长度待加密的数据、字符串等等,其都可以返回一个固定长度的MD5加密字符串。(通常32位的16进制字符串);
  2、其加密过程几乎不可逆,除非维护一个庞大的Key-Value数据库来进行碰撞破解,否则几乎无法解开。
  3、运算简便,且可实现方式多样,通过一定的处理方式也可以避免碰撞算法的破解。
  4、对于一个固定的字符串。数字等等,MD5加密后的字符串是固定的,也就是说不管MD5加密多少次,都是同样的结果。

public class MD5Util {// 加密方法:接收一个字符串明文,返回使用 MD5 加密后的哈希值public static String encrypt(String plaintext) throws NoSuchAlgorithmException {// 使用 MD5 算法创建 MessageDigest 对象MessageDigest md = MessageDigest.getInstance("MD5");// 更新 MessageDigest 对象中的字节数据md.update(plaintext.getBytes());// 对更新后的数据计算哈希值,存储在 byte 数组中byte[] digest = md.digest();// 将 byte 数组转换为十六进制字符串StringBuilder sb = new StringBuilder();for (byte b : digest) {sb.append(String.format("%02x", b & 0xff));}// 返回十六进制字符串return sb.toString();}// 解密方法:接收一个字符串明文和一个使用 MD5 加密后的哈希值,返回解密结果(true 表示匹配,false 表示不匹配)public static boolean decrypt(String plaintext, String encrypted) throws NoSuchAlgorithmException {// 调用加密方法计算出明文的哈希值String decrypted = encrypt(plaintext);// 比较计算得到的哈希值和输入的哈希值是否相同return decrypted.equals(encrypted);}
}

3.小眼睛显示密码

方法:javafx中添加一个密码文本框(passwordFild),一个普通文本框(passwordlook),一个按钮(yanjingButton),两张图片(eyesz)(eyesb),按钮和两张图片位置重叠,按钮透明,睁眼的图片透明,闭眼的图片显示,设置按钮点击方法(yanjingButtonOnAction)如下。点击切换图片的透明和显示,切换两个文本框的透明与显示。

// 在类的成员变量中添加一个标志,用于记录是否已经绑定过文本框private boolean isPasswordFieldsBound = false;//小眼睛public void yanjingButtonOnAction(ActionEvent actionEvent) {Button eyesButton = (Button) actionEvent.getSource();// 初始化绑定操作,只需执行一次if (!isPasswordFieldsBound) {passwordlook.textProperty().bindBidirectional(passwordField.textProperty());isPasswordFieldsBound = true;}eyesButton.setOnMouseClicked(event -> {String look = passwordField.getText();passwordField.setText(look);boolean isPasswordFieldVisible = passwordField.isVisible();passwordField.setVisible(!isPasswordFieldVisible);passwordlook.setVisible(isPasswordFieldVisible);eyesb.setVisible(!isPasswordFieldVisible);eyesz.setVisible(isPasswordFieldVisible);});}

4.发送验证码

注意:邮箱用自己的

同时想要如下导包:

发送验证码:

import java.util.Date;
import java.util.Properties;
import java.util.Random;
import javax.mail.Authenticator;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;public class MailUtils {private static MimeMessage message;private static String m;public MailUtils() {}public static String sendEmail(String to) throws MessagingException {String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";// QQ邮箱服务器String smtpHost = "smtp.qq.com";// 邮箱用户名,即QQ账号(自定义)String username = "2161672768";// 邮箱授权码(自定义)String password = "xbgwgdzxkqobdjih";// 自己的邮箱(自定义)String from = "2161672768@qq.com";// 要发送的邮箱地址(自定义)String toAddress = to;//Transport transport;Properties props = new Properties();props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);props.setProperty("mail.smtp.socketFactory.fallback", "false");props.setProperty("mail.smtp.port", "465");props.setProperty("mail.smtp.socketFactory.port", "465");props.setProperty("mail.smtp.auth", "true");props.put("mail.smtp.host", smtpHost);props.put("mail.smtp.username", username);props.put("mail.smtp.password", password);Session session = Session.getDefaultInstance(props, new Authenticator() {protected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication(username, password);}});InternetAddress[] addresses = new InternetAddress[]{new InternetAddress(toAddress)};message = new MimeMessage(session);message.setFrom(new InternetAddress(from));message.setRecipients(MimeMessage.RecipientType.TO, addresses);message.setSubject("验证码");message.setSentDate(new Date());m = generateVerificationCode(5);message.setText(m);System.out.println(m);Transport  transport = session.getTransport("smtp");transport.connect(smtpHost, username, password);transport.sendMessage(message, message.getAllRecipients());//  Transport.send(message);System.out.println("信息已经发送");transport.close();return m;}public static boolean judge(String s) {return m.equals(s);}//随机生成长度为5的验证码private static String generateVerificationCode(int length) {String charSet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";StringBuilder verificationCode = new StringBuilder();Random random = new Random();for(int i = 0; i < length; ++i) {verificationCode.append(charSet.charAt(random.nextInt(charSet.length())));}return verificationCode.toString();}}

结果如下:

5.倒计时

在发送验证码后,用于显示等待用户再次发送验证码的剩余时间,这里设置的是60s(注意:1000L=1s)
 //在发送验证码后,用于显示等待用户再次发送验证码的剩余时间,60spublic void count(){this.yzmButton.setVisible(false);this.wait.setVisible(true);(new Thread(() -> {int st = 60;while(st > 0) {final int finalSt = st;Platform.runLater(new Runnable() {public void run() {EmailLoginController.this.wait.setText(Integer.toString(finalSt));}});try {Thread.sleep(1000L);--st;} catch (InterruptedException var4) {InterruptedException e = var4;throw new RuntimeException(e);}}this.yzmButton.setVisible(true);this.wait.setVisible(false);})).start();}

方法用于实现较长时间的倒计时,这里设置的是120秒,用于显示验证码的有效时间。
  //方法用于实现较长时间的倒计时(120秒),用于显示验证码的有效时间。public void count00(){this.time.setVisible(true);(new Thread(() -> {int st = 120;while(st > 0) {if (this.time1 != this.time2) {this.time1 = this.time2;st = 120;}final int finalSt = st;Platform.runLater(new Runnable() {public void run() {EmailLoginController.this.time.setText("验证码有效时间剩余:" + Integer.toString(finalSt));}});try {Thread.sleep(1000L);--st;} catch (InterruptedException var4) {InterruptedException e = var4;throw new RuntimeException(e);}}this.time.setVisible(false);})).start();}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3248996.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

电力需求预测挑战赛笔记 Task2 Datawhale AI 夏令营

#AI夏令营 #Datawhale #夏令营 Task1文章链接&#xff1a; 电力需求预测挑战赛笔记 Taks1 跑通baseline-CSDN博客文章浏览阅读577次&#xff0c;点赞5次&#xff0c;收藏9次。电力需求预测挑战赛;【训练时序预测模型助力电力需求预测】https://blog.csdn.net/qq_23311271/art…

【数据结构】二叉树———Lesson2

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

如何走出低能量状态?

晚上好。 每个人都难免会有状态不佳的时候。可能是遭受压力&#xff0c;可能是事情不顺&#xff0c;也可能无缘无故、突然就陷入情绪的低谷之中。 这时&#xff0c;我们很容易感到精力不济&#xff0c;无精打采&#xff0c;明明有许多事情要做和想做&#xff0c;但总是提不起精…

JavaWeb入门程序解析(Spring官方骨架、配置起步依赖、SpringBoot父工程、内嵌Tomcat)

3.3 入门程序解析 关于web开发的基础知识&#xff0c;我们可以告一段落了。下面呢&#xff0c;我们在基于今天的核心技术点SpringBoot快速入门案例进行分析。 3.3.1 Spring官方骨架 之前我们创建的SpringBoot入门案例&#xff0c;是基于Spring官方提供的骨架实现的。 Sprin…

DevExpress WPF中文教程 - 为项目添加GridControl并将其绑定到数据

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

springboot+vue+mybatis销售评价系统+PPT+论文+讲解+售后

随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;销售评价系统当然也不能排除在外。销售评价系统是以实际运用为开发背景&#xff0c;运用软件工程开发方法&#xff0c;采用Java…

Three.js 实战【2】—— 船模型海上场景渲染

停止了好久没有更新three这方面的文章了&#xff0c;从上两年还是vue2&#xff0c;一下子都换到vue3了&#xff0c;下面这些three都是基于vue3来进行开发的哈&#xff0c;先看一下这篇文章实现的效果哈。其中关于模型什么的资源都放在Git上了 初始化场景 安装three就直接通过n…

GuLi商城-商品服务-API-品牌管理-品牌分类关联与级联更新

先配置mybatis分页&#xff1a; 品牌管理增加模糊查询&#xff1a; 品牌管理关联分类&#xff1a; 一个品牌可以有多个分类 一个分类也可以有多个品牌 多对多的关系&#xff0c;用中间表 涉及的类&#xff1a; 方法都比较简单&#xff0c;就不贴代码了

000007 - HDFS DataNode

HDFS DataNode 1. DataNode工作机制2. DataNode的数据完整性3. 掉线时限参数设置 1. DataNode工作机制 &#xff08;1&#xff09;一个数据块在 DataNode 上以文件形式存储在磁盘上&#xff0c;包括两个文件&#xff0c;一个是数据本身&#xff0c;一个是元数据包括数据块的长度…

【C++】类与对象的学习(中)

目录 一、默认成员函数&#xff1a; 二、构造函数&#xff1a; 1、定义&#xff1a; 2、理解&#xff1a; 三、析构函数&#xff1a; 1、定义&#xff1a; 2、理解&#xff1a; 四、拷贝构造&#xff1a; 1、定义&#xff1a; 2、理解&#xff1a; 五、运算符的重载&…

夏令营入门组day5

目录 一. 城市距离 二. 史莱姆 一. 城市距离 &#xff08;1&#xff09;思路 每次询问&#xff0c;对于每一个点都判断与下一个点是否为临近点会超时&#xff0c;因此预处理&#xff0c;预先判断每一个点的临近点&#xff0c;然后将花费存入前缀和数组&#xff0c;这样在每次询…

对redis进行深入学习

目录 1. 什么是redis&#xff1f;1.1 为什么使用redis作为缓存&#xff1f;1.1.0 数据库&#xff08;MySQL&#xff09;与 redis1. 存储介质不同&#xff08;408选手应该都懂hh&#xff09;2. 数据结构优化3. I/O模型差异4. CPU缓存友好性5. 单线程与多线程差异6. 持久化与缓存…

哈尔滨网站建设注意哪些问题

在进行哈尔滨网站建设时&#xff0c;需要注意以下几个问题&#xff1a; 首先&#xff0c;要明确网站的定位和目标。网站建设的首要任务是明确网站的定位和目标&#xff0c;确定网站所要传达的信息和服务内容&#xff0c;以及面向的目标用户群体。哈尔滨作为一个具有浓厚地域特色…

Linux脚本:如何编写bash脚本统计多个相关进程的CPU占用率,以此统计系统中指定多进程的总的CPU使用率

目录 一、需求 二、分析 三、脚本示例 1、创建脚本 2、编写脚本 3、脚本编写注意事项 &#xff08;1&#xff09;CPU占用率列 &#xff08;2&#xff09;多进程实例 &#xff08;3&#xff09;权限 四、运行脚本 1、给予脚本可执行权限 2、运行脚本 五、优化脚本 …

linux live555编译以及rtsp服务器搭建

一、live555源码 下载&#xff1a;点击跳转 二、编译 1、往文件 config.linux里的 COMPILE_OPTS 添加以下两个参数 -DNO_STD_LIB 和 -DNO_OPENSSL1 &#xff0c;修改后如下&#xff1a; COMPILE_OPTS $(INCLUDES) -I/usr/local/include -I. -O2 -DNO_STD_LIB -DNO_OPENSS…

大数减法c++

这里写目录标题 key key 检查减数和被减数的大小&#xff0c;大的放前&#xff0c;小的放后确定结果是正数&#xff0c;还是负数&#xff0c;即符号位从低位开始减如果a[i]<b[i]&#xff0c;则向高位借1当10&#xff0c;a[i1]–;a[i]10 #include <iostream> #include…

【python】OpenCV—Coordinates Sorted Clockwise

文章目录 1、需求介绍2、算法实现3、完整代码 1、需求介绍 调用 opencv 库&#xff0c;绘制轮廓的矩形边框&#xff0c;坐标顺序为右下→左下→左上→右上&#xff0c;我们实现一下转化为熟悉的 左上→右上→右下→左下 形式 按照这样的顺序组织边界框坐标是执行透视转换或匹…

采用反相正基准电压电路的反相运算放大器(运放)

采用反相正基准电压电路的反相运算放大器(运放) 采用反相正基准电压电路的同相运算放大器&#xff08;运放&#xff09; 设计目标 输入ViMin输入ViMax输出VoMin输出VoMax电源电压Vcc电源电压Vee电源电压Vref-5V-1V0.05V3.3V5V0V5V 设计说明1 此设计使用具有反相正基准的反…

gite+picgo+typora打造个人免费笔记软件

文章目录 1️⃣个人笔记软件2️⃣ 配置教程2.1 使用软件2.2 node 环境配置2.3 软件安装2.4 gite仓库设置2.5 配置picgo2.6 测试检验2.7 github教程 &#x1f3a1; 完结撒花 1️⃣个人笔记软件 最近换了环境&#xff0c;没有之前的生产环境舒适&#xff0c;写笔记也没有劲头&…

盒须图boxplot 展示第6条线

正常情况下,盒须图是有5条线的,但是实际产品场景是需要6条线,看了下echarts官网,没看到可配置的地方,只能自己骚操作了,效果图如下: 重点:用两条x轴,第6条线挂在第二条x轴上,且第二条x轴不展示。 option = {...,xAxis: [{type: category,data: [Class1, Class2, Cl…