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

news2024/11/18 13:19:00

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 snowflake

import (
	"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 = machineId
	t, _ := 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 main

import (
	"fmt"
	"snowflake"
)

func main() {
	err := snowflake.Init(1) // 初始化机器 ID 为 1
	if err != nil {
		panic(err)
	}

	id, err := snowflake.GetID() // 获取唯一 ID
	if err != nil {
		panic(err)
	}

	fmt.Printf("生成的ID: %d\n", id)
}

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

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

相关文章

[369]基于springboot的高校教师教研信息填报系统

摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统高校教师教研信息填报系统信息管理难度大,容错…

《素书》:为上计,事当缓;为下计,事当急

《素书》是中国古代一部重要的典籍,相传为秦末黄石公作,内容主要讲述为人处世的道理。其中,“为上计,事当缓;为下计,事当急”这句话,给人以深刻的启示。 首先,对于上策之事&#xf…

树莓派4B Qt+FFMPEG 多线程录制USB相机mjpeg数据流“h264_omx“硬件编码的MP4文件

文章目录 1 前言2 一些问题说明2.0 树莓派4b系统版本2.1 Qt2.2 FFMPEG2.3 图像格式 3 核心代码3.0 代码逻辑3.1 pro文件3.2 avframequeue.cpp3.3 decodethread.cpp 4 资源下载 1 前言 本项目为在树莓派4B开发板上,通过QtFFMPEG以多线程分别解码、编码USB摄像头视频数…

排序算法(基础)大全

一、排序算法的作用: 排序算法的主要作用是将一组数据按照特定的顺序进行排列,使得数据更加有序和有组织。 1. 查找效率:通过将数据进行排序,可以提高查找算法的效率。在有序的数据中,可以使用更加高效的查找算法&…

计算机网络:运输层 —— TCP 的拥塞控制

文章目录 TCP的拥塞控制拥塞控制的基本方法流量控制与拥塞控制的区别拥塞控制分类闭环拥塞控制算法 TCP的四种拥塞控制方法(算法)窗口慢开始门限慢开始算法拥塞避免算法快重传算法快恢复算法 TCP拥塞控制的流程TCP拥塞控制与网际层拥塞控制的关系 TCP的拥…

如何在Mysql中生成0-23完整的小时数据

目录 1. 创建表2. 插入0-23小时的数据3. 查询并合并数据 在数据分析中,我们经常需要对特定时间段内的数据进行统计和分析。 例如,在名片进线的场景中,我们可能需要了解一天内每小时的名片进线数量。 然而,由于某些时间点可能没有数…

【GeekBand】C++设计模式笔记12_Singleton_单件模式

1. “对象性能” 模式 面向对象很好地解决了 “抽象” 的问题, 但是必不可免地要付出一定的代价。对于通常情况来讲,面向对象的成本大都可以忽略不计。但是某些情况,面向对象所带来的成本必须谨慎处理。典型模式 SingletonFlyweight 2. Si…

架构篇(理解架构的模式2)

目录 一、管理和监控 大使模式:创建代表消费者服务或应用程序发送网络请求的帮助服务 反腐模式:在现代应用程序和遗留系统之间实现装饰或适配器层 外部配置存储:将应用程序部署包中的配置信息移动到中心化的位置 网关聚合模式&#xff1…

20241116解决在WIN11和ubuntu20.04通过samba共享时出现局域网千兆带宽拉满的情况

20241116解决在WIN11和ubuntu20.04通过samba共享时出现局域网千兆带宽拉满的情况 2024/11/16 13:42 缘起:最近需要通过iperf3打流,因此在ubuntu20.04服务器上常开sudo nethogs监控流量。 但是发现一个异常,ubuntu20.04服务器上发送的流量过大…

DevOps工程技术价值流:打造卓越项目协作的优化宝典

一、引言 解锁项目协作的无限潜力,覆盖全链路实现流畅高效。 在当今瞬息万变的商业环境中,项目协作的效率和效果直接关系到企业的竞争力和市场响应速度。DevOps工程技术价值流中的项目协作优化,不仅是技术层面的革新,更是团队协…

WSL--无需安装虚拟机和docker可以直接在Windows操作系统上使用Linux操作系统

安装WSL命令 管理员打开PowerShell或Windows命令提示符,输入wsl --install,然后回车 注意:此命令将启用运行 WSL 和安装 Linux 的 Ubuntu 发行版所需的功能。 注意:默认安装最新的Ubuntu发行版。 注意:默认安装路径是…

⾃动化运维利器Ansible-基础

Ansible基础 一、工作原理二、快速入门2.1 测试所有资产的网络连通性2.2 发布文件到被管理节点(资产) 三、资产(被管理节点)3.1 静态资产3.1.1 自定义资产3.1.2 自定义资产的使用3.1.3 资产选择器 四、Ansible Ad-Hoc 命令4.1 模块类型4.1.1 command & shell 模块4.1.2 cop…

简易实现自动签到并发送通知邮件

环境准备 Windows操作系统adbshell1.0.40pyhon3.7visual stdio code stableandroid手机数据线,并配置环境变量 打卡程序 需要定位屏幕坐标 import os import timea0os.popen("adb shell input keyevent 26") ##ba0.read() ##print(b) time.sleep(5) …

机器学习(贝叶斯算法,决策树)

朴素贝叶斯分类 贝叶斯分类理论 假设现有两个数据集,分为两类 我们现在用p1(x,y)表示数据点(x,y)属于类别1(图中红色圆点表示的类别)的概率,用p2(x,y)表示数据点(x,y)属于类别2(图中蓝色三角形表示的类别)的概率,那么对于一个新数据点(x,y)…

[ACTF2020]Upload 1--详细解析

信息收集 题目告诉我们是一道upload,也就是文件上传漏洞题目。 进入界面,是一个灯泡,将鼠标放在图标上就会出现文件上传的相应位置: 思路 文件上传漏洞,先看看有没有前端校验。 在js源码中找到了前端校验&#xff…

网络常用特殊地址-127.0.0.1

借用Medium博客的一张图 经常在问题解答群里留意到如下关于127.0.0.1的消息 ”如果单机版,不需要配置IP,所有配置IP的地方都写死127.0.0.1就可以” “ip: 根据实际情况填写(在 xxx-init.conf 里可以给一个默认值 127.0.0.1 ,方便…

Scala-字符串(拼接、printf格式化输出等)-用法详解

Scala 一、 使用 号连接字符串 在 Scala 中, 运算符实际上会调用 String 类的 concat 方法或者使用字符串的加法操作,生成一个新的字符串。 字符串是不可变的,每次拼接都会创建一个新的字符串。 Mr. yuTips: 性能相对较差&…

软考教材重点内容 信息安全工程师 第 4 章 网络安全体系与网络安全模型

4,1 网络安全体系的主要特征: (1)整体性。网络安全体系从全局、长远的角度实现安全保障,网络安全单元按照一定的规则,相互依赖、相互约束、相互作用而形成人机物一体化的网络安全保护方式。 (2)协同性。网络安全体系依赖于多种安全机制,通过各…

【数据库】如何保证数据库迁移过程中数据的一致性?

在数据库迁移过程中,保证数据的一致性是非常重要的,尤其是在涉及到多个表、多个数据库或分布式系统的情况下。以下是一些确保数据一致性的最佳实践和方法: 1. 备份数据 在开始迁移之前,进行全面的数据备份是确保数据一致性的第…

github 模型下载方法

github 模型权重,如果是项目下载,pth文件有时下载后只有1kb 本人测试ok下载方法: 点击view raw,然后可以下载模型权重文件了。