游戏中的-雪花算法

news2025/1/18 9:08:15

1、什么是雪花算法?

雪花算法(Snowflake)是一种生成唯一ID的算法。在游戏开发过程中会为玩家生成唯一的id,或者玩家获得一件装备,为这件装备生成唯一的Id,将此角色和装备的Id保存于数据库当中。

  • 全局唯一性
  • 不能出现有重复的ID标识,这是基本要求。
  • 递增性
  • 确保生成ID对于用户或业务是递增的。
  • 高可用性
  • 确保任何时候都能生成正确的ID。
  • 高性能性
  • 在高并发的环境下依然表现良好。

2、雪花算法是怎么实现的?

这里以ET框架中的 ActorId 举例子,id 总长度为 64位,其中总共分为了四个部分,分别占用:

  • 时间:30位  最大可表示时间为34年
  • 区服Id: 10bit 最大可以表示1024个区服
  • 进程数:8bit 最大可以表示250个进程
  • 单元数量:16bit  最大可以表示 16k个单元

以上的各个占位数可以根据项目中的需求自行调整,并非说只能这么表示。

3、如何将代表各个部分的值转化为 64位的Id?

  • 位或 “|” 运算符

Debug.Log(12 | 5);  //输出 13

 

可以看出两个二进制没一位之间进行“|”运算 只要有一个为 1,那么结果就为 “1”

  • “<<” 与 “>>”运算符

Debug.Log(5 << 2);  //返回值3

“<<”运算符执行左移位运算。在移位运算过程中,符号位始终保持不变。如果右侧空出位置,则自动填充为 0;超出 32 位的值,则自动丢弃。

可以看出5右移2位,则在 5的二进制 右边补充两个00,左边则去掉2位

那么左移就正好相反 那 1000 >> 8 举例,在左边补充8个0,右边去掉8位

Debug.Log(1000 >> 8);  //返回值3

介绍完上面需要使用的运算符,我们就可以很简单的实现代码:

 public struct UnitIdStruct
    {
        public uint Time;        // 30bit 34年
        public ushort Zone;      // 10bit 1024个区
        public byte Process;     // 8bit  Process % 256  一个区最多256个进程
        public ushort Value;     // 16bit 每秒每个进程最大16K个Unit

        public long ToLong()
        {
            ulong result = 0;
            result |= this.Value;
            result |= (ulong)this.Zone << 16;
            result |= (ulong)this.Process << (16 + 8);
            result |= (ulong)this.Time << (16 + 8 + 10);
            return (long)result;
        }

        public UnitIdStruct(int zone, int process, uint time, ushort value)
        {
            this.Zone = (ushort)zone;
            this.Process = (byte)(process % 256);
            this.Time = time;
            this.Value = value;
        }

        public UnitIdStruct(long id)
        {
            ulong result = (ulong)id;
            this.Value = (ushort)(result & ushort.MaxValue);
            result >>= 16;
            this.Process = (byte)(result & byte.MaxValue);
            result >>= 8;
            this.Zone = (ushort) (result & 0x03ff);
            result >>= 10;
            this.Time = (uint)result;
        }
    }

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

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

相关文章

Spring-AOP-面向切面编程

文章目录 目录 文章目录 前言 一 . 场景设定和问题复现 二 . 解决技术[代理模式] 2.1 代理模式 2.2 静态代理 2.3 动态代理 三 . 面向切面编程思想(AOP) 3.1 面向切面编程思想 3.2 AOP 思想的应用场景 3.3 AOP术语名词介绍 3.3.1 横切关注点 3.3.2 通知(增强) 3…

面试算法52:展平二叉搜索树

题目 给定一棵二叉搜索树&#xff0c;请调整节点的指针使每个节点都没有左子节点。调整之后的树看起来像一个链表&#xff0c;但仍然是二叉搜索树。 分析 看起来需要按照节点的值递增的顺序遍历二叉搜索树中的每个节点&#xff0c;并将节点用指向右子节点的指针连接起来。这…

观测云产品更新 | 单点登录新增 OIDC / Oauth2.0 协议、数据转发优化、场景优化等

观测云更新 数据转发 1. 新增【观测云】选项&#xff0c;支持将数据保存到观测云的对象存储&#xff0c;计费逻辑按天出账&#xff0c;每天统计存储的压缩后的数据大小&#xff0c;按照每 GB 0.007 元出具对应账单。 2. 数据转发菜单导航位置调整至【管理】模块&#xff0c;…

ActiveMQ是什么?-九五小庞

MQ是消息中间件&#xff0c;是一种在分布式系统中应用程序借以传递消息的媒介&#xff0c;常用的有ActiveMQ&#xff0c;RabbitMQ&#xff0c;kafka。ActiveMQ是Apache下的开源项目&#xff0c;完全支持JMS1.1和J2EE1.4规范的JMS Provider实现。特点&#xff1a;1、支持多种语言…

黑色星期五来袭,Ozon为你提供丰富的推广工具和资源,助你实现销售突破!

Ozon的“黑色星期五”促销活动为卖家们提供了丰富的推广工具和资源&#xff0c;以确保他们的商品在促销期间获得最大的曝光度和销售额。卖家们应该充分利用这些机会&#xff0c;制定合适的折扣策略&#xff0c;并确保他们的商品在Ozon平台上脱颖而出。 为了推广Ozon黑色星期五促…

AI、万圣节与聊斋;用AI写甜蜜恋爱小暖文;AGI新趋势与机会洞察;Meta官方Llama 2入门指南 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f440; 时代杂志评选2023年度最佳发明&#xff0c;AI赛道入选名单 https://time.com/collection/best-inventions-2023 10 月 24 日&#xff…

java那些数据类型是安全加锁的。

我还没有反应过来&#xff0c;首先考虑的是基本数据类型&#xff0c;因为底层这块儿是在没有看过&#xff0c;Spring是被final修饰不可变的。后来才明白&#xff0c;原来是问你线程安全问题。 锁数据类型。 其实就是被synchronized修饰过的数据类型。 例如StringBuffer 底层 …

国外住宅IP代理测评选择的8个方法,稳定的海外IP哪个靠谱?

一、国外住宅IP代理是什么&#xff1f; 代理服务器充当您和互联网之间的网关。它是一个中间服务器&#xff0c;将最终用户与他们浏览的网站分开。如果您使用国外代理IP&#xff0c;互联网流量将通过国外代理服务器流向您请求的地址。然后&#xff0c;请求通过同一个代理服务器…

C++类和对象下(初始化列表,静态成员,explicit关键字,友元)

C类和对象下[初始化列表,静态成员,explicit关键字,友元] 一.初始化列表1.为什么会有初始化列表2.初始化列表的语法形式3.没有默认构造函数的自定义成员变量4.初始化列表是成员变量定义的地方5.初始化列表可以跟函数体内定义搭配使用6.初始化列表执行的顺序7.总结建议 二.静态成…

KT6368A蓝牙芯片发送指令设置中文蓝牙名是乱码 这个要如何处理

目录 一、KT6368A蓝牙芯片为什么发送at指令设置中文spp蓝牙名&#xff0c;是乱码 这个要如何处理 第一步&#xff0c;在pc端新建一个txt文档&#xff0c;将您需要的名字&#xff0c;汉字打出来&#xff0c;另存为UTF-8编码 第二步&#xff0c;使用winhex软件&#xff0c;当然…

JVS智能BI(自助式商业分析)本周更新内容已上线

在数据分析与可视化的世界中&#xff0c;我们始终在寻找新的创新与突破&#xff0c;以帮助用户更高效、更直观地理解数据&#xff0c;洞察业务的深层逻辑。本周更新包含了一系列的新功能、优化及bug修复&#xff0c;更新如下&#xff1a; 新增: 1.新增图表分类功能&#xff1…

宝宝洗衣机哪个牌子质量好?小型洗衣机质量排名

说起洗衣服&#xff0c;大部分的家庭都会备有一台洗衣机&#xff0c;不过如果有婴儿的话&#xff0c;贴心的宝妈宝爸也会特意将宝宝的衣服与大人的衣服分开来进行清洗。很多妈妈都会自己动手洗。由于婴儿的皮肤比较娇嫩、敏感&#xff0c;所以儿童的衣物与成人的衣物混合使用&a…

视频特效制作软件:After Effects 2024 mac中文版新增功能

After Effects 2024 mac是一款专业的视频特效和动态图形设计软件&#xff0c;它可以帮助用户创建各种令人惊叹的视觉效果&#xff0c;例如粒子系统、合成特效、绿屏抠像等。该软件支持动画制作&#xff0c;包括关键帧动画、形状动画、运动跟踪等工具&#xff0c;可以创建复杂的…

数据库实验报告(五)

1、实验目的 &#xff08;1&#xff09; 掌握对聚集函数的使用 &#xff08;2&#xff09; 掌握对分组的使用 &#xff08;3&#xff09; 掌握非关联子查询的用法&#xff0c;了解相关的连接谓词 2、实验预习与准备 &#xff08;1&#xff09; 了解Max&#x…

面试算法53:二叉搜索树的下一个节点

题目 给定一棵二叉搜索树和它的一个节点p&#xff0c;请找出按中序遍历的顺序该节点p的下一个节点。假设二叉搜索树中节点的值都是唯一的。例如&#xff0c;在图8.9的二叉搜索树中&#xff0c;节点8的下一个节点是节点9&#xff0c;节点11的下一个节点是null。 分析&#xf…

Web开发介绍详细介绍

Web开发介绍 1 什么是web开发 Web&#xff1a;全球广域网&#xff0c;也称为万维网(www World Wide Web)&#xff0c;能够通过浏览器访问的网站。 所以Web开发说白了&#xff0c;就是开发网站的&#xff0c;例如下图所示的网站&#xff1a;淘宝&#xff0c;京东等等 那么我们…

常见接口测试面试题

1、按你的理解&#xff0c;软件接口是什么&#xff1f; 答&#xff1a; 就是指程序中具体负责在不同模块之间传输或接受数据的并做处理的类或者函数。 2、HTTP和HTTPS协议区别&#xff1f; 答&#xff1a; https协议需要到CA&#xff08;Certificate Authority&#xff0c;证书…

犀牛8 for Mac – 强大的三维建模软件,轻松实现创意设计

你是否正在寻找一款功能强大、易于使用的三维建模软件&#xff1f;犀牛8 for Mac是你的不二选择&#xff01;作为最新版本的犀牛系列软件&#xff0c;它汇集了众多令人惊叹的特性&#xff0c;让你能够轻松实现自己的创意设计。 犀牛8 for Mac拥有丰富而强大的三维建模工具&…

【Python基础】变量基本使用

变量 1.变量定义02. 变量的类型2.1 变量类型的演练 —— 个人信息2.2 变量的类型2.3转义字符 3.变量输入输出3.1变量格式化输出 4.变量命名 1.变量定义 变量定义 • 在 Python 中&#xff0c;每个变量 在使用前都必须赋值 在使用前都必须赋值&#xff0c;变量 赋值以后 该变量…

R语言使用HTTP爬虫IP写一个程序

R语言爬虫是指使用R语言编写程序&#xff0c;自动从互联网上获取数据的过程。在R语言中&#xff0c;可以使用三个主要的包&#xff08;XML、RCurl、rvest&#xff09;来实现爬虫功能。了解HTML等网页语言对于编写爬虫程序也非常重要&#xff0c;因为这些语言是从网页中提取数据…