最近一个跨平台项目中要用到MD5算法。立马想到了大名鼎鼎的Cryptopp(Cryto++)。CryptoPP功能强大且应用非常广泛,实现了众多加密算法,被很多项目使用,如OpenSSL。于是从Cryptopp的主页下载的源码进行编译。在Windows上编译为DLL一切良好,但在Mac上为IOS编译后,发现其编译的静态库体积太过庞大,单个平台上库的体积超过20M.在多平台交叉编译,尽管使用Oz优化,.a文件仍超过了100M。因为其大量使用了模板,代码膨胀极其恐怖。这个体积给项目协作带来极大不便。所有对CryptoPP库只好忍痛放弃。
只好转向另一个实现Hash算法的库Hashlib++.该库是一个简单便捷的hash加密算法库。用其官网的话说,就是"simple and very easy to use library to create a cryptographic checksum called "hash" in C++"。
其源码在此处下载!
§§ 编译
VS新建空项目,然后加入所有源码,即可使用。但如果要编译成动态库时,就需要对源码进行改动,因为源码没有提供函数导出符号。在需要导出的类前添加 __declspec(dllexport) 修饰即可导出相应的类。
继续阅读
dotNET提供了 MD5CryptoServiceProvider 类,封装了计算MD5哈希值的相关算法。使得计算MD5相当方便。下面是使用该类计算文件MD5的一个例子:
|
//using System.IO; //using System.Security.Cryptography; public string ComputeMD5(string strFilePath) { if (!File.Exists(strFilePath)) return ""; byte[] btarrInfo = File.ReadAllBytes(strFilePath); MD5CryptoServiceProvider md5CSP = new MD5CryptoServiceProvider(); byte[] btarrMd5 = md5CSP.ComputeHash(btarrInfo); string strMD5 = BitConverter.ToString(btarrMd5).Replace("-", "").ToLower(); return strMD5; } |
而C++标准库中没有相应的库。相关的开源库有CryptoPP与hashlib++等开源库。可参考这里!
当我们在实现一个带有引用参数的函数时,可能会将该参数的地址存储在该函数作用域外的某个地方。如下代码所示:
MyObject* pObj = NULL;
MyObject tempObj;
void Fun(const MyObject& obj)
{
pObj = &obj;
}
tempObj.Release();
pObj.DoSomething();
当变量tempObj释放后,pObj仍保留了其地址。这将导致pObj变为空悬指针。
为了避免此类BUG出现,Mark Linton提出了如下法则:
函数中,禁止将引用参数的指针保存到函数作用域外。如果确有需要,需要将引用参数声明为指针参数
最近重新配置vsftpd后,登入ftp后出现
500 OOPS: vsftpd: refusing to run with writable root inside chroot()
根据问题提示查看了vsftpd.conf配置。
为禁止用户访问其他目录,以保证系统安全,做了如下设置:
chroot_local_user=YES
chroot_list_enable=NO
关于此配置项的具体说明可以戳这里
检查配置未发现其他问题。考虑是用户根目录的问题,将此ftp用户的根目录移动到 xx/webroot中,并在vsftpd.conf中配置此目录。问题依旧。
后查看svftpd的更新说明 ,发现从2.3.5版本以后,为保证服务器安全,根目录必须不可写。更改目录权限,解决此问题
chmod a-w xx/webroot
service vsftpd restart
在Linux上使用goagent时可能会出现该问题。
出现该问题一般是由于root用户文件夹的权限不够,一些文件无法创建。
查看 root 下是否有.pki文件夹,若没有的话则创建之。并检查文件夹的权限。最好设置为777.
chmon 777 ~/.pki/
mkdir -p ~/.pki/nssdb
certutil -d ~/.pki/nssdb -N
§前言
高精度计算是算法较为基础的一部分。
由于现有计算编程语言的数据类型限制,对于大数据的存储能力与计算能力有限。故在需要进行大数据运算时,我们采用非常规的方法代替编程语言内置的算法,来进行计算。
大数据计算的一般思路为:将大数据拆分成多个小数据,使用编辑语言能够计算的小数据进行计算,再将小数据合并成大数据。
§大数加法
从自然数的加法开始学习。
首先要解决的是数据的存储。由于C++语言的长整型存储位数有限,存储大数据会出现溢出错误,我们将大数当作一个字符串进行存储。
然后将字符串分解成可以运算的小数,按照数据运算的一般规则来进行计算处理。
最后将多个小数组合成大数表示。
则对于大数加法有如下步骤:
- 存储。使用字符串存储大数,将大数从高位到低位依次存放于字符数组中。这符合数据表示习惯
- 转换。将字符数组从低位到高位依次转换成整型数字,并按下标从大到小依次存入整型数组(即将大数据的最低位向右对齐)。这符合数据计算习惯。
- 计算。按下标从大到小(即大数据从低位到高位),依次进行单个整型的加法运算。如果满10则向高一个进1
- 转换并存储。按下标的从小到大,将整型数组元素依次存入字符数组。
继续阅读
sqlite中支持的时间和日期函数共有 5 个:
- date(timestring, modifier, modifier, …)
- time(timestring, modifier, modifier, …)
- datetime(timestring, modifier, modifier, …)
- julianday(timestring, modifier, modifier, …)
- strftime(format, timestring, modifier, modifier, …)
上述 5 个函数,都传入时间字符串 timestring 作为参数,后面接 0 到多个modifier 修饰符。 而 strftime 将 format 作为第一个参数,对时间进行重新格式化。
timestring
可以采用以下任何一种格式:
序号 |
时间字符串 |
实例 |
1 |
YYYY-MM-DD |
2010-12-30 |
2 |
YYYY-MM-DD HH:MM |
2010-12-30 12:10 |
3 |
YYYY-MM-DD HH:MM:SS.SSS |
2010-12-30 12:10:04.100 |
4 |
MM-DD-YYYY HH:MM |
30-12-2010 12:10 |
5 |
HH:MM |
12:10 |
6 |
YYYY-MM-DDTHH:MM |
2010-12-30 12:10 |
7 |
HH:MM:SS |
12:10:01 |
8 |
YYYYMMDD HHMMSS |
20101230 121001 |
9 |
now |
2014-05-07 |
'T' 可以作为日期和时间的分隔符
modifier
- NNN days
- NNN hours
- NNN minutes
- NNN.NNNN seconds
- NNN months
- NNN years
- start of month
- start of year
- start of day
- weekday N
- unixepoch
- localtime
- utc
这些修饰符会按参数从左到右的顺序将时间进行相应的运算。
- 前 6 个修饰符可以对时间进行加减时间段的运算。如 '2 days' 表示在 timestring 的基础上再加 2 天,而 '-1 hours' 表示在前时间的基础上减一个小时。
- 'start of' 修饰符将时间转换成当月、当年、当天 有起始时间。如 'start of year' 将时间转换为 '2013-01-01 00:00:00'
- 'weekday N' 修饰符将当前时间前进到下一个星期N.(周日为星期0,周一为星期1).如今天是1月1日星期3,那么下一个星期4将是1月2日,下一个星期2将是1月8日。
- 'unixepoch' 将 10 位数字的unix时间戳转换为相应的时间字符串。
- 'localtime' 和 'utc' 将时间在格林威治时间和本地时间之间进行转换
format
格式化字符串,使用'%'进行转义
- %d 一月中的第几天,01-31
- %f 带小数部分的秒,SS.SSS
- %H 小时,00-23
- %j 一年中的第几天,001-366
- %J 儒略日数,DDDD.DDDD
- %m 月,00-12
- %M 分,00-59
- %s 从 1970-01-01 算起的秒数
- %S 秒,00-59
- %w 一周中的第几天,0-6 (0 is Sunday)
- %W 一年中的第几周,01-53
- %Y 年,YYYY
- %% % symbol
WordPress使用文章名做为标题有助于优化搜索。但使用中文文章名做标题又显得很丑。所幸有人提供了插件WP Slug Translate,可以将中文文章名自动翻译成英文。
下载安装此插件。在点击发布文章后,出现错误:
Fatal error: Call to undefined function curl_init() in /mnt/...../wp-
content/plugins/wp-slug-translate/wp-slug-translate.php on line 30
curl_init() 是CURL提供的函数。出现这个错误应该是curl没有安装。到服务器上查看,果然未安装CURL;
使用命令:
apt-get install php_curl
安装以后重新测试。文章标题的英文翻译成功,但是访问时出现404错误。查找原因是
1.apache默认没有加载重写模块。
2.PHP没有开启伪静态方法。
解决方案:
1.在 /etc/apache2/mods-enabled 中添加一个load文件,假如mymod.load,将需要加载的模块添加进去。这里需要添加的是mod_rewrite.so:
LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so
2.打开 /etc/apache2/sites-available/default
.将站点节点下的AllowOverride None 改为AllowOveride All
然后重启Apache,成功设置标题为文章中文路径的英文翻译!