## 解决哈希表hash算法的冲突问题

``````function hashCode(str) {
let hash = 0;
for (let i = 0; i < str.length; i++) {
hash = hash * 31 + str.charCodeAt(i);
}
return hash;
}

// 寻找hash冲突

const hash1 = hashCode('Aa'); // 65 * 31 + 97
const hash2 = hashCode('BB'); // 66 * 31 + 66

// 某一位上的code-1，后一位的code+31，其他位置不变

// 可以推测出
// CC = Bb
// BBBB = BBAa

console.log(hash1, hash2);

function isAscii(charCode) {
return charCode >= 65 && charCode <= 90 || charCode >= 97 && charCode <= 122;
}

function* buildStr(len) {

const list = [];
for (let i = 65; i <= 90; i++) {
list.push(String.fromCharCode(i));
}
for (let i = 97; i <= 122; i++) {
list.push(String.fromCodePoint(i));
}

const chars = new Array(len);

function* _buildStr(chars, pos) {
if (pos >= len) {
return yield chars.join('');
}
for (let i = 0; i < list.length; i++) {
chars[pos] = list[i];
yield* _buildStr(chars, pos + 1);
}
}

return yield* _buildStr(chars, 0);
}

function buildHashCode(n) {

const len = 2 ** n;

let results = [];

const map = {};

let maxHash = 0;

for (const str of buildStr(len)) {
const hash = hashCode(str);
map[hash] = map[hash] || new Set();
const charList = str.split('');
const ret = [];
_buildHashCode(charList, 0, ret);
for (const item of ret) {
}
if (map[hash].size >= len) {
maxHash = hash;
break;
}
}

// 没有找到指定长度的，返回所有字符串中hash冲突最多的那些字符串
if (maxHash === 0) {
for (const hash of Object.keys(map)) {
maxHash = Math.max(maxHash,map[hash].length);
}
}

return [...map[maxHash]];

function _buildHashCode(charList, pos, ret) {
if (pos + 1 >= charList.length) {
return;
}
let cur = charList[pos];
let next = charList[pos + 1];

let charCodeCur = cur.charCodeAt(0) - 1;
let charCodeNext = next.charCodeAt(0) + 31;

if (isAscii(charCodeCur) && isAscii(charCodeNext)) {
charList[pos] = String.fromCodePoint(charCodeCur);
charList[pos + 1] = String.fromCodePoint(charCodeNext);
ret.push(charList.join(''));
}
_buildHashCode(charList, pos + 1, ret);
charList[pos] = cur;
charList[pos + 1] = next;
}
}

const ret = buildHashCode(2);
for (const str of ret) {
console.log(str, hashCode(str));
}``````

``````2112 2112
Aaaa 2032736
AabB 2032736
AbBa 2032736
AbCB 2032736``````

## 解决哈希表hash算法的冲突问题

1.某个位置上的code-31
2.它的前一个位置上的code+1

================ 以下是原回答 ===================

## 解决哈希表hash算法的冲突问题

``````function hashCode(str) {
let hash = 0;
for (let i = 0; i < str.length; i++) {
hash = hash * 31 + str.charCodeAt(i);
}
return hash;
}``````

CC == Bb
DD == Cc
BBBB == BBAa

## 解决nodejs事件循环的疑问

``````console.log('1');

setTimeout(function() {
console.log('2');
process.nextTick(function() {
console.log('3');
})
new Promise(function(resolve) {
console.log('4');
resolve();
}).then(function() {
console.log('5')
})
})
process.nextTick(function() {
console.log('6');
})
new Promise(function(resolve) {
console.log('7');
resolve();
}).then(function() {
console.log('8')
})

setTimeout(function() {
console.log('9');
process.nextTick(function() {
console.log('10');
})
new Promise(function(resolve) {
console.log('11');
resolve();
}).then(function() {
console.log('12')
})
})``````

``````1
7
6
8
2
4
3
5
9
11
10
12``````

## 2018年，一个无名小子的复盘清单！

`2017`年一样，2018年也给自己定下了一个任务，就是在得到《每天听本书》听 300 本以上，至少订阅一个以上的大小专栏并完成学习！

## 工作上

2017年 11月离开工作快 2 年的的初始公司（就是 16 年毕业实习及转正的公司），感谢这家公司给了自己机会，让我有所成长，也结识了几位好朋友，快三年了，这几个朋友直到到现在算是最好的朋友了。

`18``01`月就被调到了研发部门，到了研发部门，我第一次使用 vue 来开发，因为第一家公司受限了内网，像需要外网的环境语言，只是平时底下练习了解而已，并没有真正实战经验（这个也是自己离开第一家公司的主要原因）`1`月到`7`月这半年期间就开始疯狂开始学习 vue，看各种跟 vue 有关的书及视频，在这半年锻炼里，最后算是可以使用 vue 独立开发了！

`2018``10` 月来到一创业公司，因为是创业公司，最后因为资金的问题，所以工作三个月后就关闭了，这三个月的时间也学到了很多，比如使用 vue 开发后台管理，这个折磨了我快一个月，最后算是搞清楚（这个也是为我现在待的这个公司打下基础，能快速熟悉环境，能独立的开发）。

`2018年10月`中旬，来到一个还算不错公司，做教育相关的，因为目前只来了 `2` 个多月，这里就不展开说了，`19` 年的总结在细说！

## 生活上

`18年03月06日`，凌晨 `01:41`segmentfault 开启第一个专栏 《终身学习者》，这也是自己今年比较有大的变化，一开始只是分享自己项目遇到的一些问题，方便以后在遇到些类问题，能快速的解决。

1. 他的文章结构清晰，篇幅完整，而我的只是讲诉一些内容，讲到哪里算到哪里。
2. 推荐参考并不是很多，对别人有用的干货少之又少。

`18年11月30日`，给自己报了吉他培训班，记得高中那会，特羡慕那些抱着吉他自弹自唱的人儿，那时家里没钱，没法报班培训，结果学了学费比较便宜的街舞，大学参加表演活动那会，再次在舞台上看到那些自弹自唱人儿，心里想，自己以后老了肯定会抱着吉他在街上或者公园自弹自唱里的一个老头！

## 2019年目标（方向）？

1. 继续整理更多有干货的文章，然后尽量有自己的好的原创文章。
2. 把吉他练好，让自弹自唱成为自己生活的一部分。
3. 专业上继续深入
4. 多读一些课外书

`2018`下半年，整片都是在叫经济不好，很多公司裁员的裁员，减薪的减薪，`19`年要怎么办呢？昨晚看到了老罗的跨年演讲，最后一段，老罗引用一句话：

## 解决node.js中await会造成内存泄漏？

``````async function start() {
await sleep(3);
start(); // 不await了，直接递归
}``````

## 解决node.js中await会造成内存泄漏？

test.js

``````function sleep(delay) {
return new Promise(resolve => setTimeout(resolve, delay));
}

const _ = require('lodash');

// console.log('start');
await sleep(_.random(10, 30));
// console.log('done');
}

async function start() {
await sleep(3);
await start(); // 去掉前面的await就好了
}

start();

setInterval(() => {
console.log(process.memoryUsage());
},10e3);``````

``````  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
30211 devel     20   0 1229m 381m  10m S  1.0  9.6   1:36.63 node test.js
# 在start函数的递归调用中取消await
21729 devel     20   0  867m  23m  10m S  1.0  0.6   1:22.73 node test.js
# 改成循环
14498 devel     20   0  867m  24m  10m S  1.0  0.6   1:11.04 node test.js``````

## 正则表达式的奇淫技巧

``'componentMapModelRegistry'.match(/^[a-z][a-z0-9]+|[A-Z][a-z0-9]*/g).join('_').toLowerCase(); // component_map_model_registry``

``````function wordCount(data) {
var pattern = /[a-zA-Z0-9_\u0392-\u03c9]+|[\u4E00-\u9FFF\u3400-\u4dbf\uf900-\ufaff\u3040-\u309f\uac00-\ud7af]+/g;
var m = data.match(pattern);
var count = 0;
if( m === null ) return count;
for (var i = 0; i < m.length; i++) {
if (m[i].charCodeAt(0) >= 0x4E00) {
count += m[i].length;
} else {
count += 1;
}
}
return count;
}

var text = '贷款买房，也意味着你能给自己的资产加杠杆，能够撬动更多的钱，来孳生更多的财务性收入。';
wordCount(text); // 38``````

``````function htmlspecialchars (str) {
var str = str.toString().replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, '&quot;');
return str;
}

htmlspecialchars('&jfkds<>'); // "&amp;jfkds&lt;&gt;"``````

``````// 方法一
function formatNum (num, n) {
if (typeof num == "number") {
num = String(num.toFixed(n || 0));
var re = /(-?\d+)(\d{3})/;
while (re.test(num)) num = num.replace(re, "\$1,\$2");
return num;
}
return num;
}

formatNum(2313123, 3); // "2,313,123.000"

// 方法二
'2313123'.replace(/\B(?=(\d{3})+(?!\d))/g, ','); // "2,313,123"

// 方法三
function formatNum(str) {
return str.split('').reverse().reduce((prev, next, index) => {
return ((index % 3) ? next : (next + ',')) + prev
});
}
``````

``````var arr = 'abcdaabc';

var info = arr
.split('')
.reduce((p, k) => (p[k]++ || (p[k] = 1), p), {});

console.log(info); //{ a: 3, b: 2, c: 2, d: 1 }``````

``````var test1 = '1234567890'
var format = test1.replace(/\B(?=(\d{3})+(?!\d))/g, ',')

console.log(format) // 1,234,567,890``````

## 前言

var 和 let 的区别是老生常谈，看到网上一些文章的总结，有的不太全面，甚至有的描述不太准确，在这里尽量全面的总结下这三者的区别。

let 是 ES6新增的变量类型，用来代替 var 的一些缺陷，跟 var 相比主要有以下区别：

### 1. let 使用块级作用域

``````if(true) {
var a = 'name'
}
console.log('a',a) // name``````

``````var a = 1;
function fn() {
var a = 2;
console.log('fn',a);
}
console.log('global',a);
fn();``````

ES6中加入块级作用域之后：

``````if(true) {
let a = 'name'
}
console.log('a',a) // Uncaught ReferenceError: a is not defined``````

### 2. let 约束了变量提升而不是没有变量提升

``````function fn() {
console.log('a',a);
var a = 1;  // undefind
}
fn()``````

a其实已经在调用前被声明了，只是没有被初始化。JavaScript会把作用域里的所有变量和函数提到函数的顶部声明,相当于：

``````function fn() {
var a;
console.log('a',a);
a = 1;  // undefind
}
fn()``````

JavaScript会使用`undefined`缺省值创建变量a,事实上浏览器并没有把声明语句放到作用域的顶部，在编译阶段，控制流进入域，该域所有的变量和函数的声明先进入内存，文中代码的相对位置不会变动。

``````function fn() {
console.log('a', a);
var a = 1;
function a () {
console.log('I am a function');
}
}
fn() // ƒ a () {console.log('I am a function');}``````

``````let a = 'outside';
if(true) {
console.log(a);//Uncaught ReferenceError: a is not defined
let a = "inside";
}``````

### 3. let 禁止重复声明变量

``````function fn (){
var a = 1;
let a = 2;
console.log(a); //SyntaxError
}

function fn (){
let a = 1;
let a = 2;
console.log(a); //SyntaxError
}

function fn (a){
let a = 2;
console.log(a); //SyntaxError
}``````

### 4. let不会成为全局对象的属性

``````var a = 1;
console.log(window.a); //1

let b = 2;
console.log(window.b); // undefined``````

### 5. const 声明的常量

``````const a = 1;

a = 2; // // Uncaught TypeError: Assignment to constant variable
const b; // Uncaught SyntaxError: Missing initializer in const declaration``````

## 最后

#### 认证与成就

• 获得 82 次点赞
• 获得 28 枚徽章 获得 2 枚金徽章, 获得 7 枚银徽章, 获得 19 枚铜徽章

(ﾟ∀ﾟ　)

(ﾟ∀ﾟ　)