【AI图像生成网站Golang】雪花算法

AI图像生成网站

目录

一、项目介绍

二、雪花算法

三、JWT认证与令牌桶算法

四、项目架构(等待更新)

五、图床上传与图像生成API搭建(等待更新)

六、项目测试与调试(等待更新)

雪花算法

        雪花算法 (Snowflake) 是一种高效、可扩展的分布式唯一ID生成算法,最早由 Twitter 开发,并被广泛应用于各种系统中。本文将结合 Sonyflake 的实现代码,讲解雪花算法的原理与实现。


雪花算法之所以能够作为一种分布式 ID 生成策略,是因为它能够保证:

  1. 全局唯一性:无重复 ID。
  2. 高效性:生成速度快。
  3. 有序性:ID 基于时间戳,有趋势递增的特性。

它生成的 64 位二进制 ID 通常由以下几部分组成:

  • 符号位 (1 bit):始终为 0。
  • 时间戳 (41 bits):记录自某个时间起始点的毫秒数。
  • 机器ID (10 bits):标识生成 ID 的机器节点。
  • 序列号 (12 bits):用于每毫秒内生成多个 ID。

其中,符号位为0是因为 Snowflake ID 被设计为无符号整数(uint64),没有负数的场景,符号位只是为了占位,以保持位数的一致性。

假设生成的 ID 为 145038507964891137,转化为二进制:
0000001000001000011001000101010011111101000000000000000000000001

这串二进制可以分解为 64 位:

在这里插入图片描述

位数范围(从左到右)部分二进制值十进制值说明
1符号位00固定为 0,表示正数
2 - 40时间戳00000010000010000110010001010100111111013829335678自起始时间以来的毫秒数
41 - 56机器 ID100000000000000032768当前机器编号
57 - 64序列号000000011当前毫秒内生成的第 1 个 ID

Sonyflake 简介

Sonyflake 是 Go 语言实现的雪花算法改进版本,相比 Twitter 的实现,它:

  • 使用更精准的时间单位。
  • 提供了自定义机器 ID 的能力。
  • 支持长时间运行,且避免了时钟回拨问题。

具体的改进有:

改进点Snowflake 的问题Sonyflake 的优化
符号位固定占用 1 位,没有实际用途去掉符号位,增加实际可用位数。
机器 ID 长度10 位,只支持最多 1024 个节点16 位,支持最多 65536 个节点。
时间戳处理依赖系统时间,易受时钟回拨影响提供时钟回拨检测,支持自定义起始时间戳,增强容错能力。
序列号长度12 位,支持每毫秒最多生成 4096 个 ID8 位,支持每毫秒最多生成 256 个 ID,节省位数并满足一般业务需求。
中央协调器依赖需要依赖 ZooKeeper 或其他工具分配机器 ID通过回调函数动态获取机器 ID,减少依赖,降低运维复杂度。
并发和适用场景优化针对大规模分布式系统设计更适合中小规模分布式系统,尤其是局部部署场景,如小型服务集群或边缘计算。

本项目使用 Sonyflake 来生成用户、分组和作品的唯一 ID:

package snowflakeimport ("fmt""github.com/sony/sonyflake""time"
)var (sonyFlake     *sonyflake.Sonyflake // 实例sonyMachineID uint16               // 机器ID
)// 获取机器 ID
func getMachineID() (uint16, error) {return sonyMachineID, nil
}// 初始化 Sonyflake
func Init(machineId uint16) (err error) {sonyMachineID = machineIdt, _ := time.Parse("2006-01-02", "2024-11-16") // 设置起始时间settings := sonyflake.Settings{StartTime: t,              // 起始时间MachineID: getMachineID,   // 获取机器 ID}sonyFlake = sonyflake.NewSonyflake(settings) // 生成节点实例return
}// 获取唯一 ID
func GetID() (id uint64, err error) {if sonyFlake == nil {err = fmt.Errorf("sonyflake not inited")return}id, err = sonyFlake.NextID()return
}

步骤解析

(1) 初始化实例

通过 Init(machineId uint16) 初始化 Sonyflake 实例,设置了:

  • 开始时间:2024-11-16。
  • 机器 ID:通过 getMachineID 获取。
settings := sonyflake.Settings{StartTime: t,              // 起始时间MachineID: getMachineID,   // 获取机器 ID
}
sonyFlake = sonyflake.NewSonyflake(settings) // 创建实例

(2) 生成唯一 ID

使用 sonyFlake.NextID() 获取唯一 ID,每次调用都会根据时间戳和机器 ID 自动生成新的 ID。

id, err = sonyFlake.NextID()

(3) 机器 ID 获取

getMachineID 函数为每个实例分配唯一的 uint16 值,用于区分生成 ID 的节点。

func getMachineID() (uint16, error) {return sonyMachineID, nil
}

Sonyflake 的 ID 生成

以下是调用代码生成示例 ID的步骤:

package mainimport ("fmt""snowflake"
)func main() {err := snowflake.Init(1) // 初始化机器 ID 为 1if err != nil {panic(err)}id, err := snowflake.GetID() // 获取唯一 IDif err != nil {panic(err)}fmt.Printf("生成的ID: %d\n", id)
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JMeter与大模型融合应用之JMeter日志分析服务化实战应用

JMeter与大模型融合应用之JMeter日志分析服务化 引言 在当今的互联网时代,网站和应用程序的性能直接影响到用户的体验和业务的成功。为了保证系统的稳定性和高效性,性能测试成为了软件开发过程中的一个重要环节。在这其中,Apache JMeter作为一款开源的性能测试工具,凭借其…

Docker环境搭建Cloudreve网盘服务(附shell脚本一键搭建)

Docker搭建Cloudreve Cloudreve介绍: Cloudreve 是一个基于 ThinkPHP 框架构建的开源网盘系统,旨在帮助用户以较低的成本快速搭建起既能满足个人也能满足企业需求的网盘服务。Cloudreve 支持多种存储介质,包括但不限于本地存储、阿里云OSS、…

浪浪云轻量服务器搭建vulfocus网络安全靶场

什么是网络安全靶场 网络安全靶场是一个模拟真实网络环境的训练平台,旨在为网络安全专业人员提供一个安全的环境来测试和提高他们的技能。靶场通常包括各种网络设备、操作系统、应用程序和安全工具,允许用户在其中进行攻击和防御练习。以下是网络安全靶…

对称加密算法DES的实现

一、实验目的 1、了解对称密码体制基本原理 2、掌握编程语言实现对称加密、解密 二、实验原理 DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密…

【linux学习指南】VSCode部署Ubantu云服务器,与Xshell进行本地通信文件编写

文章目录 📝前言🌠 步骤🌉测试同步 🚩总结 📝前言 本文目的是讲使用Vscode连接Ubantu,与本地Xshell建立通信同步文件编写。 查看本机系统相关信息: cat /etc/lsb*DISTRIB_IDUbuntu: 表示这是 Ubuntu 发行…

实战:一文讲透模糊匹配的三种方式的区别

在 SQL 查询中,模糊查询是我们常用的工具之一。LIKE 关键字配合 % 符号,可以实现前缀匹配、后缀匹配和包含匹配等多种查询方式。然而,不同的匹配方式对查询性能会有显著影响。本文将详细探讨在 SQL 查询中,字符串前后加 % 与只在后面加 % 的性能差异及其应用场景。 一、SQL…

利用Blackbox AI让编程更轻松

引言 随着人工智能技术的发展,AI已经成为工作中不可缺少的工具之一。俗话讲“术业有专攻”,对AI来说当然也是如此。由于训练集、调教等方面的差别,不同的AI适用的工作也不尽相同。在编程辅助方面,已经有一系列比较成熟的平台&…

Vue学习记录03

响应式基础 声明响应式状态 ref() 在组合式API中,推荐使用ref()函数来声明响应式状态: import { ref } from vueconst count ref(0) ref()接收参数,并将其包裹在一个带有.value属性的ref对象中返回: const count ref(0)con…

排序排序的概念及其运用和选择排序

排序排序的概念及其运用和选择排序 7. 排序7.1 排序的概念及其运用7.2 选择排序算法——直接选择排序选择排序基本思想:直接选择排序选择排序原理参考程序 如何交换数据直接选择排序的特性总结: 7. 排序 7.1 排序的概念及其运用 排序:所谓排…

【目标检测】用YOLOv8-Segment训练语义分割数据集(保姆级教学)

前言 这篇教程会手把手带你用 YOLOv8-Segment 搭建一个属于自己的分割任务项目。从环境配置到数据集准备,再到模型训练和测试,所有步骤都有详细说明,适合初学者使用。你将学会如何安装必要的软件,标注自己的数据,并使…

爬虫开发工具与环境搭建——开发工具介绍

第二章:爬虫开发工具与环境搭建 第一节 开发工具介绍 爬虫开发需要一些合适的工具和框架来高效地抓取网页数据。在这节中,我们将介绍常用的开发工具,帮助开发者快速搭建爬虫开发环境。 1. Python与爬虫框架选择 Python因其简洁、易学的语法…

类和对象——拷贝构造函数,赋值运算符重载(C++)

1.拷⻉构造函数 如果⼀个构造函数的第⼀个参数是自身类类型的引用,且任何额外的参数都有默认值,则此构造函数也叫做拷贝构造函数,也就是说拷贝构造是⼀个特殊的构造函数。 // 拷贝构造函数//d2(d1) Date(const Date& d) {_year d._yea…

高级数据结构——hash表与布隆过滤器

文章目录 hash表与布隆过滤器1. hash函数2. 选择hash函数3. 散列冲突3.1 负载因子3.2 冲突解决3. STL中的散列表 4. 布隆过滤器4.1 背景1. 应用场景2. 常见的处理场景: 4.2 布隆过滤器构成4.3 原理4.4 应用分析4.5 要点 5. 分布式一致性hash5.1 缓存失效问题 6. 大数…

xcode-select: error: tool ‘xcodebuild‘ requires Xcode, but active developer

打开 .sh 文件所在的终端窗口,执行终端命令:sh 文件名.sh,出现如下错误: 解决办法:

java中volatile 类型变量提供什么保证?能使得一个非原子操作变成原子操作吗?

大家好,我是锋哥。今天分享关于【java中volatile 类型变量提供什么保证?能使得一个非原子操作变成原子操作吗?】面试题。希望对大家有帮助; java中volatile 类型变量提供什么保证?能使得一个非原子操作变成原子操作吗&…

candence : 通孔焊盘、插装器件封装绘制

通孔焊盘、插装器件封装绘制 以2.54mm 2x10的 排针为例绘制封装 一、 flash 热风焊盘制作 1、新建 2、选择 flash SYMBOL,并设置保存路径 3、add flash 具体参数 花焊盘参数 Inner diameter 通孔直径(1.0mm) 圆形补偿值(0.4mm)1.4mm Outer diameter 通孔直径…

VSCode设置

打开设置页 VSCode打开配置页面,有多种方式: a. 点击左上角 File(文件) -> Preferences (首选项) -> Settings(设置)。 b. 使用快捷键 Ctrl ,(Windows) 或 Cmd ,(Mac)。 c. 点击左下角 Manage(管理) -> Settings(设置)。 VSCode设置页面打…

SpringMVC数据校验、数据格式化处理、国际化设置

SpringMVC数据校验、数据格式化处理、国际化设置 1.数据验证 (1)使用JSR-303验证框架 JSR(Java Specification Requests),意思是Java 规范提案。JSR-303是JAVA EE 6中的一项子规范,叫做Bean Validation。JSR 303&am…

加速 AI 创新:引入 Elastic AI 生态系统

作者:来自 Elastic Alyssa Fitzpatrick, Steve Kearns 生成式人工智能 (Generative AI - GenAI) 正在改变我们所熟知的商业格局。为了简化和加速开发人员构建和部署检索增强生成 (retrieval augmented generation - RAG) 应用程序的方式,Elastic 自豪地宣…

SpringSecurity 鉴权认证入门讲解

​ Spring Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富。 ​ 一般来说中大型的项目都是使用SpringSecurity 来做安全框架。小项目有Shiro的比较多,因为相比与Sp…