md5
数学事实
反复线性和非线性交替计算
代码js
1 | function md5(string) { |
两段看起来复杂的函数 其实 是字符串通过utf8/ascii之类转换成 数值
其中一些值和公式的设计大自能有个想法感受了,还不明白的是offset和s的设计为什么是这样的,搜了半天也没搜到
反复线性和非线性交替计算
1 | function md5(string) { |
两段看起来复杂的函数 其实 是字符串通过utf8/ascii之类转换成 数值
其中一些值和公式的设计大自能有个想法感受了,还不明白的是offset和s的设计为什么是这样的,搜了半天也没搜到
两个大质数相乘,只需要最多两个数字长度的乘积的复杂度,而把两个质数乘积进行拆分可能要 其中较小数字的时间复杂度。也就是易于验证,难于破解。
假设两个长度为2048(二进制下)的质数相乘,最多只需要 2048 x 2048
的时间,而枚举拆分需要2^2048
的时间, 目前最快的?gnfs算法的复杂度也是
$O(e^{\sqrt{\frac{64}{9}}(\log N)^{\frac 13}(\log\log N)^{\frac 23}})$
$C=M^e \bmod n$
n=pq,其中p和q为大质数
M 要加密的信息 (需要 和n互质也就是至少p,q其中一个互质,1/pq 当质数足够大时碰撞概率极小,其实因为公钥信息里已经有n了,也不会碰撞)
e 和 (p-1)(q-1)互质,简单些 e直接取小于 (p-1)(q-1)的质数
公钥(e,n), 所有人都知道
私钥匙$(e,p,q)$
$de = 1 \bmod ((p-1)(q-1))$,计算d,d是e关于(p-1)(q-1)的乘法模逆元 log 级别复杂度
$ C^d = (M^e)^d = M^{ed} = M^{1+k(p-1)(q-1)} (\bmod n)$
费马小定理:p质数,a和p互质,$a^{p-1} = 1 (\bmod p)$
如果 M 和p 互素, 有 $C^d = M\cdot (M^{p-1})^{k(q-1)} = M \cdot 1^{k(q-1)} = M \cdot 1 = M (mod p)$ 即是 $ C^d - M = 0 (mod p) $
否则 $ M = 0 \bmod p$, $ C^d = (M^e \bmod n)^d = (0^e)^d = 0 (\bmod p) $,也有 $C^d - M = 0(\bmod p)$
同理 有$C^d - M = 0 (\bmod q)$
因此 $C^d - M = 0 (\bmod (n=pq))$即$C^d = M (\bmod n)$
也就是 我们通过幂次直接拿到 M在$\bmod n$的意义下
也就是公钥里只有(e,n), 计算不出p和q, 就意味着计算不出(p-1)(q-1),也就计算不出d,也就无法直接d的幂次。
另一个问题就是 模运算 是否有办法开e次根。
在就是历史信息,如果有人(机器)能拆解n,那么所有用到相应公私钥的信息都能被破解了。
所以据说 现在512位的似乎已经被认为不安全了。可以类似NFS, GNFS,SIQS, 和ECM 定向爆破。https://blog.csdn.net/tigerisland45/article/details/51348854
穷举自己可以按(10^10) 需要1台计算机一秒来估计,是不可能的。例如枚举需要 2**512//(10**10)//60//60//24//365 = 42515880041674902015392012297710065092210064119077858250011293263957902175524946019792853558367907875729426237273230754863501657825807236
台计算机 年
而好处是,如果始终拆解质数乘积是难的,那么只需要单纯的增加位数即可,这样在实现上的额外代价就是生成代价,对应的拆解代价是按照幂次增长。
而生成的代价,解密的代价较大,注定了它用在少量数据,而剩余的数据加密,还是要靠对称加密。
产生3072 bits的私钥(不要分享)
openssl genrsa -out private.pem 3072
通过私钥产生公钥(可以给任何人)
openssl rsa -in private.pem -out public.pem -outform PEM -pubout
产生原始消息(模拟要给你发信息的人)
echo 'too many secrets' > file.txt
通过你提供的公钥加密(并把加密后的信息发给你)
openssl rsautl -encrypt -inkey public.pem -pubin -in file.txt -out file.ssl
你通过私钥解密
openssl rsautl -decrypt -inkey private.pem -in file.ssl -out decrypted.txt
查看消息
cat decrypted.txt
众所周知,一般上个git之类都会用openssh
提供的 ssh-keygen
生成公私钥。但是公钥不能像上面那样直接用
方法是用id_rsa.pub
转换,生成一个openssl能使用的PEM格式
再用
ssh-keygen -f ~/.ssh/id_rsa.pub -e -m PKCS8 > id_rsa.pem.pub
剩余的操作和上面一样
加密联系我
id_rsa.pub
1 | ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDgFNXLxLccaE5w6GBHwg+sqXXphmEDgxjTQj6UYgu1et0yIqY2NU6ouAp91SnQAsW6htF1g6X7SjVuW4cgN+3R4nCociNBwvzPIiUbInhn1J5oaI3wRktWLOlxqUO1ykvsCjoZty+wfMvy5zFnG6+bjkn3i0WfCNoEOiHuaOJd+dt0l0Kha6+QdIHj6zLPH65y/oW5WJWe4iZoOjmBKJ+Ps9oGVMJxOZDCTWCUJQV1DFZgo7WAkT2/Thfz390sNiuclDE6rpmLPAqCGjtOO4zhoUpwq35QmTNjlg5PutM6s+SQZMnX2ZKgkUV/QWNenC40yS/L0Sj57ZCHvbEenh8v4YC4YRcW2BrdSloaPmhne1tH5xpw/By7UKAG/S3liebb5B3tjLpvjI0EU8l6/I6JxAtYe19tKpDPC/J1Z1L1nQ//rjDiVayg0u4Ti1grngTcTogTU9ttvwGFgdBCBkI/4xQB8kkSXllMLf2AmocFjyU/TFa1fgw+PBv8Ydi+T48= yexiaorain@gmail.com |
目前看到angular2+ 官方的使用是 karma + jasmine
Can I use Karma with testing framework X?
Yes. There are plugins for most of the common testing frameworks (such as Jasmine, Mocha, QUnit). If there is no plugin for the testing framework you like, go ahead and write one. It is simple - you can start by looking into the source code of the existing ones.
karma创建一个web server。
浏览器通过手动方位 karma server 监听的地址(默认9876),或者自动让karma 知道运行哪个browsers,来让浏览器可以被捕获
可用的列表http://karma-runner.github.io/5.0/config/browsers.html
见下面 paper的pdf内容
在真实环境中测试
支持远程控制
执行速度快
可以跟第三方 IDE 进行交互
支持 ci 服务
高扩展性,支持插件开发
支持调试
paper 3.1的表
paper 2.1
真实设备上运行测试
远程控制
高效, 无缝隙使用流程
Integration with IDEs and text editors
Integration with CI Servers
扩展性
Debugging
包含 client/server,基于Http 通信
Chapter 4
速度
可靠性
在真实浏览器上测试 并
seamless workflow
paper 4.1
监听文件
与 client 进行通讯
向开发者输出测试结果
提供 client 端所需的资源文件
跟client双向通讯,例如开始和结束测试,收集测试结果
Web Server, 给客户端提供静态资源文件
给开发者输出报告
检测变化并通知client,类似 一些热更新之类的?
可以 多client 对1个server
和server双向通信
框架内自己没有,可以用很多三方的framework,例如上面的jasmine
这是开发者编写的内容了
…….我感觉阿里社区里面那个翻译也不错。。可以不用继续啃英文了
测试的代码 全部在客户端运行,这个客户端是真实的客户端,它可以是chrome,firefox等等
karma主要的工作是支撑测试的提供,例如静态文件服务,文件变化监听等,而具体代码测试内容是在karma启动的客户端(浏览器)中,依靠用户编写的测试代码和第三方测试框架完成的。
http://karma-runner.github.io/5.0/intro/how-it-works.html
https://raw.githubusercontent.com/karma-runner/karma/master/thesis.pdf
https://fed.taobao.org/blog/taofed/do71ct/karma-origin/
https://medium.com/@me_37286/yoni-goldberg-javascript-nodejs-testing-best-practices-2b98924c9347
https://projecteuler.net/problem=74
用rust写了一遍,觉得根据常识1e6数据量,应该1s内随便跑,结果5s+,
就换成C++写了一遍,发现是因为rust没开O2?开了以后还真就和C++差不多的时间
1 | use std::collections::HashMap; |
1 | #include <bits/stdc++.h> |
rust不带-O2
大概5s+
,带了和C++
相近都是0.3s
左右, 真的快
Intel Core i7-7700HQ @ 8x 3.8GHz
!clang++ -o "%<" "%" -std=gnu++17 -O2 -g -Wall -Wcomma
1 | clang version 6.0.0-1ubuntu2 (tags/RELEASE_600/final) |
!rustc "%" -O
rustc 1.43.1 (8d69840ab 2020-05-04)
rust写好的代码转换成C++是真的轻松,C++转换成rust就会很累(除非各种 as,unwrap
npm login
npm init
npm publish
& github仓库更新如果是之前用taobao的镜像,记得发布时 更改设置为官方地址
个人建议一些“没有建设意义”的仓库,就不要去抢名字了,带上自己的scope发布
发布前** 记得清理敏感信息**,似乎npm虽然可以unpublish但是,不能重置版本号 https://www.npmjs.com/policies/unpublish
例如源码是用typescript写的,发布要发布编译后的文件,但是git中不会跟踪。
不建议使用.npmignore
(会使.gitignore
在publish时无效),建议的是在package.json
中增加"files":["dist/**/*"]
这样的白名单
例如
在开发的库中构建后调用yarn link
会提示success Registered "@cromarmot/isNumberOne"
在用来测试的文件夹中 调用 yarn link "@cromarmot/isNumberOne"
即可使用
取消link:把上面link替换为unlink,使用对应的yarn unlink
命令即可
link以后,代码更新只需要编译原来的库代码,不需要重新link
一个基于莫比乌丝反演的数字1判断
https://www.npmjs.com/package/@cromarmot/is-number-one
在业务页面 希望对输入框进行额外操作,例如 当输入长度大于 10则截取到前10位
BUG产生,业务页面写了如下的代码
1 | data(){ |
然后 前技术经理写的输入框 却可以一直输入
我用render函数 写的没有问题
直接裸的input也没问题
加了一堆console,基本确定bug的原理是
官方直接input
能用,但不知道是怎么封装的
我封装的是参考https://cn.vuejs.org/v2/guide/render-function.html#v-model
的
然而,如果你直接尝试上面所写的你会发现并不如愿
没有使用watch,而是使用domProps
我封装的是参考https://cn.vuejs.org/v2/guide/render-function.html#v-model
的没有使用watch,而是使用domProps
直接的话就是用domProps
但是有个问题,如果使用者
另外的话,我本来实现的是会提供一个接受过滤函数的props,业务层可以传递过滤函数而不是通过外部watch
目前看起来,双向绑定就应该做全,不要单向使用。
有些时候不设置默认值?
1 | <template> |
新做了个输入框,在三次封装时用 $attrs
,本地一切正常,内部测试环境出现bug:输入不了值。
版本都查过,一样的代码,最后猜是不是vue的问题。
查了一下在线的vue版本是2.6.11
而内部发布版本是2.5.13
。
把调试的vue换成指定版本2.5.13
重现了bug。
顺着官方https://github.com/vuejs/vue/releases
看
看到v2.6.1
修复了v-model: add value to $attrs if not defined in props
看pull requests 9331
和9330
似乎很多人也都遇到了
果然XD
内部测试发布的版本已经在生产使用,当然是锁版本不会改了,把开发用的vue调试版换回了2.5.13
,然后对应组件增加props
的value
和 value
的传递。// 还好是新组建
虽然听说并且实践了无数次锁版本
,但亲身是第一次遇到版本问题!(之前几次其它第三方资源有bug 都是最新的官方资源也没修复的,例如swiper有个重复emit的bug放了很久也不知道现在修复没
锁版本!!!!!
官方vue虽然说是开发环境是https://cdn.jsdelivr.net/npm/vue/dist/vue.js
,但实际因为生产的vue 是锁了版本,所以为了保持和生产一致,如果要使用在线资源可以使用https://cdn.jsdelivr.net/npm/vue@版本号/dist/vue.js
1 | yarn global add jasmine-core karma karma-chrome-launcher karma-jasmine karma-jasmine-html-reporter |
一些改动
1 | @@ -21,8 +21,12 @@ module.exports = function (config) { |
编写你的测试代码,语法见jasmine文档
启动
1 | karma start |
karma-jasmine-html-reporter
这个赞极少 却超高的周下载量 所以大多是连带下载的吧
目前一组能用的
1 | { |
不知道cnpm搞了什么私货,同样的命令 npm 能用 cnpm就是报错。目前采取全局yarn按加项目内karam.conf.js了 (感觉操作不科学啊
报错 大概意思不在module内
搜到很多加plugins或者在预处理调用webpack的,暂时没有采用
可行的一种方案,目前把files
的配置写成
1 | [{pattern:'src/**/*.js',type:'module'}] |
需要包括源代码 和 测试代码
https://github.com/CroMarmot/karma.jasmine.demo
// 迷,不是有处理args的办法吗?)
1 | #include<iostream> |
1 | #include<iostream> |
直接丢浏览器或者node里跑代码
函数的值产生和继续执行
1 |
|
嵌套
1 | function* g1() { |
遍历输出
1 | function* foo() { |
在函数调用是可以传参数,同时,在next调用也是可以传参数