平时我们玩游戏或者登陆软件的时候,都会给你分配一个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,希望对大家有所帮助。