Base64哈希散列函数Flags

Android端在编码过程中尤其涉及到加解密我们通常将加解密后的byte字节数组转换为String,通常做法是使用Android 提供的Base64(android.util)的encodeToString函数:

String strData = Base64.encodeToString(encryptData,Base64.DEFAULT);

那么这其中的flags到底是什么意思?作用是什么呢?

通过源码可见flags取值范围如下:

/**
 *编码后用CR LF这一对作为一行末尾的换行,而不是unix风格的LF换行
 **/
public static final int CRLF = 4; 
/**
 *此flag下编码完成的String中会包含换行符\n,+号,末尾以“=”结束
 **/   
public static final int DEFAULT = 0;
/**
 *Flag to pass to {@link Base64OutputStream} to indicate that it
 * should not close the output stream it is wrapping when it
 * itself is closed.
 **/ 
public static final int NO_CLOSE = 16;
/**
 *此flag下最终的编码字符串会包含换行符\n,但是末尾去掉了“=”
 **/ 
public static final int NO_PADDING = 1;
/**
 *此flag下最终编码字符串不包含换行符\n,且字符串全在一行,设置此flag后CRLF flag无效
 **/ 
public static final int NO_WRAP = 2;
/**
 *编码后,用-代替+,用_代替/,避免请求是url编码造成的传输问题,包含换行符\n
 **/ 
public static final int URL_SAFE = 8;

PS:可以结合使用满足我们不同需求:

Base64.encodeToString(encryptData,Base64.DEFAULT|Base64.NO_WRAP|Base64.URL_SAFE);

小结

用flag Default编码后,字符串中带有+号和\n换行符,发起网络请求时,当以base64字符串作为参数值传递时,url为了传输安全会把+号全部变成空格,在接收端就会产生各种问题,且前端用的部分的Base64解码库不支持\n,当字符串中含有\n时无法解码还原为图片。所以Base64编码时建议使用NO_WRAP | URL_SAFE,这样可以避免较多问题。

非加密哈希散列函数可以用多种算法实现,其中比较常用的有MD5、SHA-1、SHA-256等。下面以SHA-256为例,介绍如何用C语言实现非加密哈希散列函数。 首先,我们需要用到一个SHA-256的库,比较常用的有openssl库和libgcrypt库。这里我们以openssl库为例,需要在代码中include openssl/sha.h头文件,并链接libssl库。具体实现如下: ```c #include <stdio.h> #include <string.h> #include <openssl/sha.h> int main() { char str[] = "hello world"; unsigned char hash[SHA256_DIGEST_LENGTH]; SHA256(str, strlen(str), hash); int i; for(i = 0; i < SHA256_DIGEST_LENGTH; i++) { printf("%02x", hash[i]); } printf("\n"); return 0; } ``` 上面的代码中,我们将字符串"hello world"进行SHA-256哈希哈希结果存储在hash数组中,然后将hash数组中的每个字节以16进制形式输出。输出结果为: ``` b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9 ``` 这就是字符串"hello world"的SHA-256哈希值。 需要注意的是,SHA-256哈希值的长度为32字节,因此我们定义了一个长度为32的unsigned char数组来存储哈希值。如果使用其他哈希算法,哈希值的长度可能不同,需要相应地调整数组的长度。 另外,由于SHA-256是一种加密哈希算法,其安全性比较高,但运算速度相对较慢。如果只需要实现非加密哈希散列函数,可以考虑使用一些速度更快的算法,如MurmurHash、CityHash等。这些算法的实现比较简单,可以在网上找到相关的代码库。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值