ckHash函数类,将字符串映射成数字,同时可以将数字映射成字符串

说明

1、所谓的BitMap就是用一个bit位来标记某个元素所对应的value,而key即是该元素,由于BitMap使用了bit位来存储数据,因此可以大大节省存储空间。

2、ckHash函数类适用于做key-value的字符映射关系,利用字符串正则密钥给定一个值范围,以及bit长度len,将字符串映射成0-len之间的数字,同时将0-len之间的数字还原成字符串,这样能使空间的利用率很高,准确度100%(数字和字符一一对应的关系)。

3、最下面包含BitMap算法的实现,字符查询以及去重

用途:

bitMap算法之ckHash函数类,将字符串映射成数字,同时可以将数字映射成字符串,

用于数据压缩,加密解密,以及bitMap大数据查询,去重

作者:caoke

demo测试100%通过

//demo
var d=new ckHash("http://www.baidu.com/[1~8dc-].[1~8dcv][1~8dcv]ml")
// console.log(d.toString(11))
// console.log(d.toNumber(d.toString(11))) for(var i=0;i< d.length;i++){
const str=d.toString(i);
const num=d.toNumber(str)
console.log(str)
console.log(i,num)
}

  

测试输出

http://www.baidu.com/1.11ml
0 0
http://www.baidu.com/1.12ml
1 1
http://www.baidu.com/1.13ml
2 2
http://www.baidu.com/1.14ml
3 3
http://www.baidu.com/1.15ml
4 4
http://www.baidu.com/1.16ml
5 5
http://www.baidu.com/1.17ml
6 6
http://www.baidu.com/1.18ml
7 7
http://www.baidu.com/1.1dml
8 8
http://www.baidu.com/1.1cml
9 9
http://www.baidu.com/1.1vml
10 10
http://www.baidu.com/1.21ml
11 11
http://www.baidu.com/1.22ml
12 12
http://www.baidu.com/1.23ml
13 13
http://www.baidu.com/1.24ml
14 14
http://www.baidu.com/1.25ml
15 15
http://www.baidu.com/1.26ml
16 16
http://www.baidu.com/1.27ml
17 17
http://www.baidu.com/1.28ml
18 18
http://www.baidu.com/1.2dml
19 19
http://www.baidu.com/1.2cml
20 20
http://www.baidu.com/1.2vml
此处省略1000行

源码

/*
* ckHash函数类,将字符串映射成数字,同时可以将数字映射成字符串,
* 用于数据压缩,加密解密,以及bitMap大数据查询,去重
* 作者:caoke
* */ class ckHash{
//输入密钥
constructor(secretKey){
this.secretKey=secretKey; this.regexp=new RegExp(secretKey.replace(/\[([^\[]+?)\]/g,function (m) {
return '('+m.replace(/-/g,'\\-').replace(/~/g,'-')+')'
}).replace(/[\\\^\:\.\?\+]/g,'\\$&')); this.lenArr=[];
this.dataArr=[];
secretKey.replace(/\[([^\[]+?)\]/g,(m,p1)=>{
const arr=[];
for(let i=0;i<p1.length;i++){
if(p1[i]==='~'){
arr.push('~')
}else{
arr.push(p1[i].charCodeAt(0));
}
}
let length=0;
for(let i=0;i<arr.length;i++){
if(arr[i]==='~'){
length=length+arr[i+1]-arr[i-1];
i++;
}else{
length=length+1;
}
}
this.lenArr.push(length)
this.dataArr.push(arr)
})
this.length=this.lenArr.reduce((x,y)=>x*y)
}
//将数字映射成字符串
toString(number){
const arr=[];
for(let i=this.lenArr.length-1;i>0;i--){
const n1=number%this.lenArr[i];
arr.unshift(n1)
number=Math.floor(number/this.lenArr[i]);
}
arr.unshift(number) const codeArr=[]
for(let i=0;i<arr.length;i++){
const dataArr=this.dataArr[i];
let len= arr[i]; let code;
for(let j=0;j<dataArr.length;j++){
if(dataArr[j]==='~'){
if(len<dataArr[j+1]-dataArr[j-1]){
code=dataArr[j-1]+len+1;
break;
}else{
len=len-(dataArr[j+1]-dataArr[j-1]);
j++;
}
}else if(len===0){
code=dataArr[j]
break;
}else{
len--;
}
}
codeArr.push(String.fromCharCode(code))
}
let index=0;
return this.secretKey.replace(/\[([^\[]+?)\]/g,(m,p1)=>{
return codeArr[index++];
})
}
//将字符串映射成数字
toNumber(string){
if(this.regexp.test(string)){
const arr=[]
string.replace(this.regexp,function (m,p1) {
for(let i=1;i<arguments.length-2;i++){
arr.push(arguments[i].charCodeAt(0))
}
}); const lenArr=[]
for(let i=0;i<arr.length;i++){
const dataArr=this.dataArr[i];
let len= 0;
for(let j=0;j<dataArr.length;j++){
if(dataArr[j]===arr[i]){
break;
}else if(dataArr[j]==='~'){
if(arr[i]<=dataArr[j+1]&&arr[i]>dataArr[j-1]){
len=len+arr[i]-dataArr[j-1]-1;
break;
}else{
len=len+dataArr[j+1]-dataArr[j-1];
j++;
}
}else{
len++;
}
}
lenArr.push(len)
}
let number=0;
let jz=1;
for(let i=lenArr.length-1;i>=0;i--){
number=number+jz*lenArr[i];
jz=jz*this.lenArr[i]
} return number; }else{
throw string +' 不在匹配范围内';
}
}
} //demo
var d=new ckHash("http://www.baidu.com/[1~8dc-].[1~8dcv][1~8dcv]ml")
// console.log(d.toString(11))
// console.log(d.toNumber(d.toString(11))) for(var i=0;i< d.length;i++){
const str=d.toString(i);
const num=d.toNumber(str)
console.log(str)
console.log(i,num)
}

    

BItMap算法的实现

//BitMap算法,大数据查询,算法复杂度O(1)
class BitMap {
constructor(secretKey){
this.hashFunc=new ckHash(secretKey);
this.length=this.hashFunc.length
this.buffer=Buffer.alloc(this.length);
}
has(num){
if(typeof num ==='string'){
num=this.toNumber(num);
}
const n=num>>3;
const k=num%8;
return (this.buffer[n]&1<<k)!==0
}
toString(num){
return this.hashFunc.toString(num);
}
toNumber(str){
return this.hashFunc.toNumber(str);
}
set(num){
if(typeof num ==='string'){
num=this.toNumber(num);
}
const n=num>>3;
const k=num%8;
this.buffer[n]=this.buffer[n]|(1<<k);
}
del(num){
if(typeof num ==='string'){
num=this.toNumber(num);
}
const n=num>>3;
const k=num%8;
this.buffer[n]=this.buffer[n]&~(1<<k);
}
} //demo
const b=new BitMap('http://www.baidu.com/[1~8dc-].[1~8dcv][1~8dcv]ml') for(var i=0;i< b.length;i++){
const str=b.toString(i);
const num=b.toNumber(str);
console.log(i,num,str)
//设置
b.set(str)
} for(var i=0;i< b.length;i++){
const str=b.toString(i);
//查询
console.log(b.has(str),b.has(i))
}
console.log(b.buffer)

  

  

bitMap算法实现以及ckHash函数类,将字符串映射成数字,同时可以将数字映射成字符串的更多相关文章

  1. 毫秒查询9位数qq号码是否存在-BitMap算法应用

    实现详情请查看博客园 https://www.cnblogs.com/caoke/p/10793885.html 随机注册10万个放入BitMap,然后查询qq号码是否已存在,算法复杂度O(1). / ...

  2. C++ STL算法系列4---unique , unique_copy函数

     一.unique函数 类属性算法unique的作用是从输入序列中“删除”所有相邻的重复元素. 该算法删除相邻的重复元素,然后重新排列输入范围内的元素,并且返回一个迭代器(容器的长度没变,只是元素顺序 ...

  3. C++ STL算法系列1---unique , unique_copy函数

     一.unique函数 类属性算法unique的作用是从输入序列中“删除”所有相邻的重复元素. 该算法删除相邻的重复元素,然后重新排列输入范围内的元素,并且返回一个迭代器(容器的长度没变,只是元素顺序 ...

  4. 大数据排序算法:外部排序,bitmap算法;大数据去重算法:hash算法,bitmap算法

    外部排序算法相关:主要用到归并排序,堆排序,桶排序,重点是先分成不同的块,然后从每个块中找到最小值写入磁盘,分析过程可以看看http://blog.csdn.net/jeason29/article/ ...

  5. Go语言实现bitmap算法

    有关bitmap算法的介绍资料网上很多,这里不赘述,各种语言的实现也不少,但是Go语言版的bitmap不多,本文就来写一个Go版的bitmap实现. 首先创建一个 bitmap.go 文件,定义一个b ...

  6. BitMap算法知识笔记以及在大数据方向的使用

    概述 所谓的BitMap算法就是位图算法,简单说就是用一个bit位来标记某个元素所对应的value,而key即是该元素,由于BitMap使用了bit位来存储数据,因此可以大大节省存储空间,这是很常用的 ...

  7. BitMap算法应用:Redis队列滤重优化

    工作中有用到Redis滤重队列. 原来的方法如下: 方法一 为了保证操作原子性,使用Redis执行Lua脚本. 在脚本中的逻辑是,如果队列不超过某个数值,进行一次lrem操作(队列使用list结构), ...

  8. bitmap算法

    概述 所谓bitmap就是用一个bit位来标记某个元素对应的value,而key即是这个元素.由于采用bit为单位来存储数据,因此在可以大大的节省存储空间 算法思想 32位机器上,一个整形,比如int ...

  9. hdwiki model目录下的函数类

    model目录下的函数类    actions.class.php(站内地图相关) getHTML:获得页面菜单和相关信息 getMap:生成站内地图 adv.class.php 对wiki_adve ...

随机推荐

  1. ModelState.IsValid always returning true while mocking a request

    ASB.net  MVC 视图验证里有一个IValidatableObject接口.这里面有一个验证方法.通常我们表单提交的时候dto就是用一个实现IValidatableObject这个接口的实体. ...

  2. Storm框架:Storm整合springboot

    我们知道Storm本身是一个独立运行的分布式流式数据处理框架,Springboot也是一个独立运行的web框架.那么如何在Strom框架中集成Springboot使得我们能够在Storm开发中运用Sp ...

  3. Java Swing实战(五)表格组件JTable(1)

    dbPanel面板的配置告一段落. 接下来配置taskPanel 面板. /** * @author: lishuai * @date: 2018/11/26 13:51 */ public clas ...

  4. Netty面试

    声明:此文章非本人所 原创,是别人分享所得,如有知道原作者是谁可以联系本人,如有转载请加上此段话  1.BIO.NIO 和 AIO 的区别? BIO:一个连接一个线程,客户端有连接请求时服务器端就需要 ...

  5. JavaScript之DOM操作(一)

    这篇文章写于2017-3-19,所有例子基于Chrome 56.0.X.如果时间太久,请自行查阅MDN等获取最新规范内容. 1.节点类型 从MDN上获取的最新情况 一共12种节点类型,分别由12个数值 ...

  6. Jquery实现可拖动进度条demo

    html <div class="progress"> <div class="progress_bg"> <div class= ...

  7. java.lang.VerifyError: com/google/android/gms/measurement/internal/zzw

    android studio  com.google.android.gms:play-services 运行报错:java.lang.VerifyError: com/google/android/ ...

  8. SLAM会被深度学习方法取代吗?

    日益感觉到自己对深度学习的理解比较肤浅,这段且当做是以前的认识. 上上周去围观了泡泡机器人和AR酱联合举办的论坛.在圆桌阶段,章国峰老师提了一个问题:SLAM会被深度学习方法取代吗?这是一个很有趣的话 ...

  9. EJB JBOSS的安装

    下载地址:http://www.jboss.org/jbossas/downloads 下载JBoss 4.2.3-->解压 启动:bin-->run.bat 管理后台:www.local ...

  10. vue项目部署上线

    前言 今天把自己写的demo登录写完了,就想着试着走一下部署上线的流程.参考了很多的文档,终于成功进行了部署.在这里将服务器的搭建和vue项目的 部署上线进行整理(都是基础的知识,希望对大家有帮助.对 ...