CocosCreator + nodeJs 课程5 随机数ID的生成

平时我们玩游戏或者登陆软件的时候,都会给你分配一个ID。众所周知,庞大的玩家基数会拥有庞大的ID数据,如果不做管理,随机给你分配一个ID,可能就要花很长时间才能匹配到不重复的ID。接下来,我们就来了解一下如何不重复并快速的分配ID。

我们先做准备工作:
需要的serverConfigDebug.json文件:

{
"ids":{
      "from":10000000,
      "to":99999999,
      "countpath":"./idcounts.txt",
      "path":"./ids.txt",
      "create":false
  },
}

好了,上述的
from表示所生成的ID从10000000开始。
to表示最大ID。
countpath中的txt文件 用来存储 已经生成的ID数量,每生成一个,该文件数值加1。这样下次再生成ID时,直接按序获取。
path表示将所有from到 to之间的ID存储到txt文件。
create表示path中的文件是否存在,如果存在直接读取,如果不存在,开始创建所有的ID,并存储。

准备就绪,我们开始编写代码,
1、首先写一个关于serverConfigDebug.json文件的操作:

var fs = require("fs");
var path = require("path");
function Config() {
    this.configJson = {};
}
Config.prototype.load = function (fileName) {
//获取json文件内容
    var jsonString = fs.readFileSync(path.normalize(__dirname + "/../"+fileName),"utf-8");
    this.configJson = JSON.parse(jsonString);
}

Config.prototype.get = function (key) {
    //获取对应的key=>value
    return this.configJson[key];
}

Config.getServerConfig = function () {
    var config = new Config();
    //加载并返回   
    config.load("serverconfdebug.json");
    return config.configJson;
}
module.exports = Config;

2、创建一个IDs.js 文件,用来生成随机ID
(1)创建一个IDs类:

class IDs 
{
	constructor()
	{ 
	}
}

(2)在IDs类中添加一个generateIdsToFile方法,用来生成并乱序ID。方法中使用的是二进制形式进行存储,可以有效降低内存的使用,也会增加读取的速度。

generateIdsToFile(from, to, file_path, count_file_path)
	{
		var num_count = (to - from) + 1
		var buffer = Buffer.alloc(num_count * 4)
		for(var i=form; i<=to; i++)
		{
			var start = i - from
			start = start * 4
			buffer.writeUInt32LE(i, start)
		}

		for(var i=0; i<num_count; i++)
		{
			var random_index = UnitTools.random(0, num_count-1)
			var current_num = buffer.readUInt32LE(i * 4)
			var change_num = buffer.readUInt32LE(random_index * 4)

			buffer.writeUInt32LE(change_num, i * 4)
			buffer.writeUInt32LE(current_num, random_index * 4)
		}

		fs.writeFileSync(file_path, buffer,  {flag:'w'})
		fs.writeFileSync(count_file_path, 0, {flag:'w'})
	}

(3)接下来我们调用一下上述函数

initFromConfig()
	{
		this.idConfig = Config.get_server_config().ids
		if(this.idConfig.create)
		{
			this.generateIdsToFile(this.idConfig.from, this.idConfig.from, __dirname + '/../' + this.idConfig.path, this.idConfig.countpath)
		}
	}

(4)获得ID:

async getID()
	{
		var self = this

		return new Promise(function(resolve, reject){
			var countNum = parseInt(fs.readFileSync(__dirname+'/../'+self.idConfig.countpath, 'utf-8'))
			var start_buffer_index = countNum * 4
			var stream = fs.createReadStream(__dirname+"/../"+self.idConfig.path, {start:start_buffer_index, end:start_buffer_index+4, flags:'r'})

			stream.on('data', function(dataBuffer){
				var id = dataBuffer.readUInt32LE(0)
				resolve(id)
				
			})

		})
	}

到此时,随机生成ID就已经完成了,这里生成的是8位数的ID,希望对大家有所帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值