stl的容器库非常强大,但是为了要兼容各种元素类型,采用了模板进行泛化,这样的好处就是使用非常的方便,但是编译器会对使用到的每种类型都进行一遍实例化,用的类型太多的话不仅影响编译速度而且生成的可执行文件也很冗余。
因此,TBOX在设计容器架构的时候,引入tb_item_func_t类型,来设置容器使用的成员类型,这样在实现容器通用性的同时,也不会产生过的冗余,而且容器接口操作上,同样相当的便利。
可以先看个简单使用哈希的例子:
```c
/* 初始化hash, 哈希桶大小8
* 键:大小写敏感字符串
* 值:long整型
*/
tb_hash_map_ref_t hash = tb
继续阅读 »
中二的成长之路
我用真心对你,你却用QR敷衍我。
附件下载
试试QR的哈希,并且注意红字。
使用图片显示的某些信息做哈希
再次观察图片,看看不一样的颜色和字体,也许需要做一下哈希
扫描题目给的图片得到3ukka4wZf2Q9H8PEI5YKFA== ,但直接base64解码得到乱码。谷歌搜索发现可能性很多,各种尝试无果。
使用binwalk分离出压缩包。不是伪加密,爆破也无果。
经过主办方提示看看不一样的颜色和字体 注意到AES,搜索发现与今年9月份的问鼎杯CTF一道题极为相似,就是压缩包的密码经过AES加密后再进行base64编码。这样就有了基本的思路。但还缺少一些信息,比如AES采用哪种模式,key是什么,如果有IV,
继续阅读 »
链接:Link 状态:Runtime Error
前言
这题做的可真够久的,整整三个小时。但即便如此,还是只过了一部分的点,另一部分报运行时错误——估计是哈希表设计的不太好。但这确实是一道好题,因此,在睡觉前决定记录一下。
分析
很容易便想到:用一个三元组$(x,y,z)$表示节点,表示内容为x的节点下跟着标号为y和z的左右子树。这样一来,一类相同的子树便可以唯一确定了,而不必每构造一棵子树就把整棵树遍历一遍。
对于三元组的储存,刚开始图方便,用了数组。查找也是用了$O(n)$的线性查找。磕磕碰碰写了两个多小时然后兴冲冲地提交,结果TLE了…………没办法,只好又花了半个小时写了一个哈希表,然后就是上文说过的情况了:Runti
继续阅读 »
参考文章
iOS学习笔记——HTTPS原理篇
HTTPS工作原理和TCP握手机制
图解SSL/TLS协议
How to Use SSL/TLS with Node.js
在上一篇博文《Node核心模块之crypto》中,提到了加密(摘要,加密解密,签名等)的四种常见类型:
Hash(哈希)
HMAC(基于哈希的消息认证码)
加密,解密
签名,验证
HTTPS的整个过程和以上几种方法密切相关。
CA证书
CA 即 Certificate Authority (数字证书认证机构),CA证书的签发以及验证包含以下三方:
CA
Server
Client
过程包括:
Server生成一对公钥和私钥
Server将公钥以及域名等信
继续阅读 »
Hash
哈希函数(散列函数)主要用于生成消息摘要(Message Digest),即将任意大小的数据映射到一个固定大小的数据。最常见的如MD5,SHA1等。
```
--------- hash function --------------
| input |---------------->| hash value |
```
在Node中,通过crypto.getHashes()可以查看所支持的哈希算法:
js
crypto.getHashes()
// => [ 'DSA', 'DSA-SHA', 'DSA-SHA1', ... ]
下面是一个MD5的例子:
```js
var hash = crypt
继续阅读 »
go提供了一种叫map的数据结构,可以翻译成映射,对应于其他语言的字典、哈希表。借助map,可以定义一个键和值,然后可以从map中获取、设置和删除这个值,尤其适合数据查找的场景。但是map的使用有一定的限制,如果是在单个协程中读写map,那么不会存在什么问题,如果是多个协程并发访问一个map,有可能会导致程序退出,并打印下面错误信息:
继续阅读 »
最近稍微整理了下tbox的utils模块,发现里面有很多都是一些,之前放置的hash算法,例如:md5, sha1, crc32, adler32啊什么,比较凌乱。
因此我抽时间整理下这些hash算法,打算单独建立个hash算法模块,来放置各种大大小小的hash算法。
顺便把tbox里面用到的一些字符串hash算法,也做了些整理,一并归并到这个新模块中,例如比较常用的一些字符串哈希:
bkdr, fnv, fnv-1a, aphash, rshash, djb2, murmur, sdbm, blizzard ...
其中 bkdr 的效果比较好,因此目前作为tbox里面主要的string哈希来用,其他的hash虽然实现
继续阅读 »
1. 迭代器模式
提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。迭代器模式的结构:
抽象容器:一般是一个接口,提供一个iterator()方法,例如java中的Collection接口,List接口,Set接口等。
具体容器:就是抽象容器的具体实现类,比如List接口的有序列表实现ArrayList,List接口的链表实现LinkList,Set接口的哈希列表的实现HashSet等。
抽象迭代器:定义遍历元素所需要的方法,一般来说会有这么三个方法:取得第一个元素的方法first(),取得下一个元素的方法next(),判断是否遍历结束的方法isDone()(或者叫hasNext()),移出当前对象的方
继续阅读 »
【什么是Hash】
Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
继续阅读 »