C# 对象UID分配算法

这篇具有很好参考价值的文章主要介绍了C# 对象UID分配算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

不多说,算法本身很简单,但是有一些要注意的地方,我写在注释里文章来源地址https://www.toymoban.com/news/detail-569618.html

using System.Collections.Generic;
using System.Security.Cryptography;

namespace AirFramework
{
	//注意最大数量是int.MaxValue,而不是long.MaxValue
    public class UIDGenerator
    {
    	//用于存储存活的UID
        private readonly HashSet<long> _pool;
        //当前UID位置
        private long _pointer = 0;
		
		//初始化带有一个适当的初始容量可以提高性能,但是无关紧要
        public UIDGenerator(int defaultCount = 0)
        {
            _pool = new HashSet<long>(defaultCount);
        }

        /// <summary>
        /// 存活的ID数量
        /// </summary>
        public int SurvivalCapacity => _pool.Count;

        /// <summary>
        /// 从生成器申请ID
        /// </summary>
        /// <returns></returns>
        public long Allocate()
        {
            if(SurvivalCapacity>=int.MaxValue) throw new IDOverflowException();
            //使用while在ulong溢出时不会导致深循环,溢出时全部ID接近于MAX,突然重置为0后一般在极少的循环
            //次数内即可找到未占用的ID值,即时有少量的长期占用区域,也可以被快速跳过
            while (_pool.Contains(_pointer++))
            {
                if (_pointer == long.MaxValue) _pointer = 0;
            }
            _pool.Add(_pointer);
            return _pointer;
        }

        /// <summary>
        /// 将ID释放回生成器,注意这个步骤是必要的,否则终有一刻ID将会因为耗尽无法生成
        /// </summary>
        /// <param name="id"></param>
        public void Release(long id)
        {
            _pool.Remove(id);
        }

        /// <summary>
        /// 强制清空ID占用,注意这个操作可能导致ID重复发生不可挽回的后果
        /// </summary>
        public void ForceReleaseAll()
        {
            _pool.Clear();
        }
    }


    public class IDOverflowException:System.Exception
    { 
        public IDOverflowException() :base($"For each generator, the maximum number of IDs that exist simultaneously is {int.MaxValue}, please check if there are any IDs that have not been released") 
        {
            
        }
    }
}

到了这里,关于C# 对象UID分配算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JVM 给对象分配内存空间

    指针碰撞 空闲列表 TLAB 为对象分配空间的任务实际上便等同于把一块确定大小的内存块从Java堆中划分出来。 指针碰撞:(Bump The Pointer) 堆的内存是绝对规整的,内存主要分为两部分,所有使用过的内存被放在一边,空闲的内存被放在另一边,中间放着一个指针作为分界点

    2024年02月11日
    浏览(33)
  • jvm对象创建和内存分配优化

    1、类加载检测 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。 new指令对应语言层面讲是,new、对

    2024年02月13日
    浏览(52)
  • JVM—对象的创建流程与内存分配

    对象创建的流程图如下: 内存分配的方式有两种: 指针碰撞(Bump the Pointer) 空闲列表(Free List) 分配方式 说明 收集器 指针碰撞(Bump the Pointer) 内存地址是连续的(新生代) Serial和ParNew收集器 空闲列表(Free List) 内存地址不连续(老年代) CMS收集器和Mark-Sweep收集器

    2024年04月10日
    浏览(45)
  • JVM对象创建与内存分配机制深度剖析

    (1)类加载检查 虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程; 所以所类加载是 懒加载 ; new指令对应到语

    2024年02月13日
    浏览(41)
  • JVM运行时区域——对象创建内存分配过程

            新创建的对象 , 都存放在伊甸园区域 ,当垃圾回收时,将伊甸园区域的垃圾数据销毁,然后将存活的对象转移到幸存者0区域,之后创建的新的对象还是存放在伊甸园区域,等到再次垃圾回收后,将伊甸园区域和幸存者0区域中存活的对象一起转移到幸存者1区域中

    2024年02月15日
    浏览(43)
  • Jvm创建对象之内存分配-JVM(七)

    上篇文章介绍了jvm创建,会校验是否已加载类,没有则加载,通过之前学的源码,classLoader加载完之后,虚拟机开始给类分配内存,指针移动分配和free链表分配,解决并发分配情况用cap和TLAB方法。之后设置对象头部信息,有mark word线程锁,分代年龄等,klass pointer。还有指针

    2024年02月13日
    浏览(63)
  • C# string 防止GC及内存分配

    目录 前言: 字符串的内存分配 如何理解C#字符串常量池 如何防止string产生GC C# 使用注意情况  在 C# 中,字符串类型是一个引用类型,它的内存分配方式与其他引用类型类似,都是在堆上分配内存。 字符串类型的内存分配方式有以下几种: 字符串常量池:字符串常量池是一

    2024年02月09日
    浏览(33)
  • JVM对象在堆内存中是否如何分配?

    1:指针碰撞:内存规整的情况下 2:空闲列表: 内存不规整的情况下 选择那种分配方式 是有 java堆是否规整而决定的。而java堆是否规整是否对应的垃圾回收器是否带有空间压缩整理的能力决定的。 因此当使用Serial,ParNew等带有压缩整理过程的收集器时,系统采用的分配算法是

    2024年02月16日
    浏览(38)
  • java和c#里的TOTP统一算法

    本文根据 RFC4226 和 RFC6238 文档,详细的介绍 HOTP 和 TOTP 算法的原理和实现。 两步验证已经被广泛应用于各种互联网应用当中,用来提供安全性。对于如何使用两步验证,大家并不陌生,无非是开启两步验证,然后出现一个二维码,使用支持两步验证的移动应用比如 Google Aut

    2024年02月08日
    浏览(35)
  • Net 高级调试之十一:托管堆布局架构和对象分配机制

    一、简介 今天是《Net 高级调试》的第十一篇文章,这篇文章来的有点晚,因为,最近比较忙,就没时间写文章了。现在终于有点时间,继续开始我们这个系列。这篇文章我们主要介绍托管堆的架构,对象的分配机制,我们如何查找在托管堆上的对象,我学完这章,很多以前

    2024年02月05日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包