phphash
❶ php 函数hash_hmac()怎么用
hash_hmac — 使用 HMAC 方法生成带有密钥的哈希值
stringhash_hmac(string$algo,string$data,string$key[,bool$raw_output=false])
参数:
algo:要使用的哈希算法名称,例如:"md5","sha256","haval160,4" 等。
data:要进行哈希运算的消息。
key:使用 HMAC 生成信息摘要时所使用的密钥。
raw_output:设置为 TRUE 输出原始二进制数据, 设置为 FALSE 输出小写 16 进制字符串。
返回值:
如果 raw_output 设置为 TRUE, 则返回原始二进制数据表示的信息摘要,否则返回 16 进制小写字符串格式表示的信息摘要。
如果 algo 参数指定的不是受支持的算法,返回 FALSE。
❷ php的hash_hmac 不能直接使用么 该如何配置呢
可以啊
官方手册上的例子
echo hash_hmac('ripemd160', 'The quick brown fox jumped over the lazy dog.', 'secret');
结果:
❸ php hash_hmac如何解密
hmac算法的主体还是散列函数,散列算法本身是抽取数据特征,是不可逆的。
所以“再得到aaa”——“逆运算获得原数据”这种想法,是不符合hmac设计初衷,可以看成是对hmac安全性的直接挑战,属于解密,属于误用。
类似的需求,应该使用AES加密算法实现
❹ php实现HashCode方法
php的一种hashCode方法,参考如下:
function hashCode($str)
{
if(empty($str)) return '';
$mdv = md5($str);
$mdv1 = substr($mdv,0,16);
$mdv2 = substr($mdv,16,16);
$crc1 = abs(crc32($mdv1));
$crc2 = abs(crc32($mdv2));
return bcmul($crc1,$crc2);
}
❺ php代码hash解析
就是生成一段hash值,比md5和sha1更加安全而已
❻ PHP中用hash实现的数组
PHP中使用最多的非Array莫属了,那Array是如何实现的?在PHP内部Array通过一个hashtable来实现,其中使用链接法解决hash冲突的问题,这样最坏情况下,查找Array元素的复杂度为O(N),最好则为1.
而其计算字符串hash值的方法如下,将源码摘出来以供查备:
复制代码
代码如下:
static
inline
ulong
zend_inline_hash_func(const
char
*arKey,
uint
nKeyLength)
{
register
ulong
hash
=
5381;
//此处初始值的设置有什么玄机么?
/*
variant
with
the
hash
unrolled
eight
times
*/
for
(;
nKeyLength
>=
8;
nKeyLength
-=
8)
{
//这种step=8的方式是为何?
hash
=
((hash
<<
5)
+
hash)
+
*arKey++;
hash
=
((hash
<<
5)
+
hash)
+
*arKey++;
hash
=
((hash
<<
5)
+
hash)
+
*arKey++;
hash
=
((hash
<<
5)
+
hash)
+
*arKey++;
//比直接*33要快
hash
=
((hash
<<
5)
+
hash)
+
*arKey++;
hash
=
((hash
<<
5)
+
hash)
+
*arKey++;
hash
=
((hash
<<
5)
+
hash)
+
*arKey++;
hash
=
((hash
<<
5)
+
hash)
+
*arKey++;
}
switch
(nKeyLength)
{
case
7:
hash
=
((hash
<<
5)
+
hash)
+
*arKey++;
/*
fallthrough...
*/
//此处是将剩余的字符hash
case
6:
hash
=
((hash
<<
5)
+
hash)
+
*arKey++;
/*
fallthrough...
*/
case
5:
hash
=
((hash
<<
5)
+
hash)
+
*arKey++;
/*
fallthrough...
*/
case
4:
hash
=
((hash
<<
5)
+
hash)
+
*arKey++;
/*
fallthrough...
*/
case
3:
hash
=
((hash
<<
5)
+
hash)
+
*arKey++;
/*
fallthrough...
*/
case
2:
hash
=
((hash
<<
5)
+
hash)
+
*arKey++;
/*
fallthrough...
*/
case
1:
hash
=
((hash
<<
5)
+
hash)
+
*arKey++;
break;
case
0:
break;
EMPTY_SWITCH_DEFAULT_CASE()
}
return
hash;//返回hash值
}
ps:对于以下函数,仍有两点不明:
hash
=
5381设置的理由?
这种step=8的循环方式是为了效率么?
❼ PHP mysql 实现hash分区的问题
当分片索引不是纯整型的字符串时,只接受整型的内置 hash 算法是无法使用的。为此,stringhash 按照用户定义的起点和终点去截取分片索引字段中的部分字符,根据当中每个字符的二进制 unicode 值换算出一个长整型数值,然后就直接调用内置 hash 算法求解分片路由:先求模得到逻辑分片号,再根据逻辑分片号直接映射到物理分片。
用户需要在 rule.xml 中定义 partitionLength[] 和 partitionCount[] 两个数组和 hashSlice 二元组。
在 DBLE 的启动阶段,点乘两个数组得到模数,也是逻辑分片的数量
并且根据两个数组的叉乘,得到各个逻辑分片到物理分片的映射表(物理分片数量由 partitionCount[] 数组的元素值之和)
此外根据 hashSlice 二元组,约定把分片索引值中的第 4 字符到第 5 字符(字符串以 0 开始编号,编号 3 到编号 4 等于第 4 字符到第 5 字符)字符串用于 “字符串->整型”的转换
在 DBLE 的运行过程中,用户访问使用这个算法的表时,WHERE 子句中的分片索引值会被提取出来,取当中的第 4 个字符到第 5 字符,送入下一步
设置一个初始值为 0 的累计值,逐个取字符,把累计值乘以 31,再把这个字符的 unicode 值当成长整型加入到累计值中,如此类推直至处理完截取出来的所有字符,此时的累计值就能够代表用户的分片索引值,完成了 “字符串->整型” 的转换
对上一步的累计值进行求模,得到逻辑分片号
再根据逻辑分片号,查映射表,直接得到物理分片号
- <property name="partitionLength">1</property><property name="partitionCount">2880</property>
- <property name="partitionLength">1,1</property><property name="partitionCount">1440,1440</property>
- <property name="partitionLength">2880</property><property name="partitionCount">1</property>
- <property name="partitionLength">512,256</property><property name="partitionCount">1,2</property>
- <property name="partitionLength">256,512</property><property name="partitionCount">2,1</property>
- <property name="partitionLength">512,256</property><property name="partitionCount">1,2</property>
- <property name="partitionLength">512,256</property><property name="partitionCount">1,2</property>
- <property name="partitionLength">256,512</property><property name="partitionCount">2,1</property>
若希望从首字符开始截取 k 个字符( k 为正整数),配置的内容形式可以为“ 0 : k ”、“ k ”或“ : k ”;
若希望从末字符开始截取 k 个字符( k 为正整数),则配置的内容形式可以为“ -k : 0 ”、“ -k ”或“ -k : ”;
若希望从头第 m 个字符起算截取 n 个字符( m 和 n 都是正整数),则先计算出 i = m - 1 和 j = i + n - 1,配置的内容形式为“ i : j ”;
若希望从尾第 m 个字符起算截取从尾算起的 n 个字符( m 和 n 都是正整数),则先计算出 i = -m + n - 1,配置的内容形式可以为“ -m : i ”;
若希望不截取,则配置的内容形式可以为“ 0 : 0 ”、“ 0 : ”、“ : 0 ”或 “ : ”
与MyCat的类似分片算法对比
两种算法在string转化为int之后,和 hash 分区算法相同,区别也继承了 hash 算法的区别。
开发注意点
【分片索引】1. 必须是字符串
【分片索引】2. 最大物理分片配置方法是,让 partitionCount[] 数组和等于 2880
例如:
或
【分片索引】3. 最小物理分片配置方法是,让 partitionCount[] 数组和等于 1
例如
【分片索引】4. partitionLength 和 partitionCount 被当做两个逗号分隔的一维数组,它们之间的点乘必须在 [1, 2880] 范围内
【分片索引】5. partitionLength 和 partitionCount 的配置对顺序敏感
和
是不同的分片结果
【分片索引】6. 分片索引字段长度小于用户指定的截取长度时,截取长度会安全减少到符合分片索引字段长度
【数据分布】1. 分片索引字段截取越长则越有利于数据均匀分布
【数据分布】2. 分片索引字段的内容重复率越低则越有利于数据均匀分布
运维注意点
【扩容】1. 预先过量分片,并且不改变 partitionCount 和 partitionLength 点乘结果,也不改变截取设置 hashSlice 时,可以避免数据再平衡,只需进行涉及数据的迁移
【扩容】2. 若需要改变 partitionCount 和 partitionLength 点乘结果或改变截取设置 hashSlice 时,需要数据再平衡
【缩容】1. 预先过量分片,并且不改变 partitionCount 和 partitionLength 点乘结果,也不改变截取设置 hashSlice 时,可以避免数据再平衡,只需进行涉及数据的迁移
【缩容】2. 若需要改变 partitionCount 和 partitionLength 点乘结果或改变截取设置 hashSlice 时,需要数据再平衡
配置注意点
【配置项】1. 在 rule.xml 中,可配置项为<property name="partitionLength"> 、<property name="partitionCount"> 和 <property name="hashSlice">
【配置项】2.在 rule.xml 中配置 <property name="partitionLength">标签
内容形式为:<物理分片持有的虚拟分片数>[,<物理分片持有的虚拟分片数>,...<物理分片持有的虚拟分片数>]
物理分片持有的虚拟分片数必须是整型,物理分片持有的虚拟分片数从左到右与同顺序的物理分片数对应,partitionLength 和partitionCount 的点乘结果必须在 [1, 2880] 范围内
【配置项】3. 在 rule.xml 中配置 <property name="partitionCount">标签
内容形式为:<物理分片数>[,<物理分片数>,...<物理分片数>]
其中物理分片数必须是整型,物理分片数按从左到右的顺序与同顺序的物理分片持有的虚拟分片数对应,物理分片的编号从左到右连续递进,partitionLength 和 partitionCount 的点乘结果必须在 [1, 2880] 范围内
【配置项】4. partitionLength 和 partitionCount 的语义是:持有partitionLength[i] 个虚拟分片的物理分片有 partitionCount[i] 个
例如
语义是持有 512 个逻辑分片的物理分片有 1 个,紧随其后,持有 256 个逻辑分片的物理分片有 2 个
【配置项】5.partitionLength 和 partitionCount 都对书写顺序敏感,
例如
分片结果是第一个物理分片持有头512个逻辑分片,第二个物理分片持有紧接着的256个逻辑分片,第三个物理分片持有最后256个逻辑分片,相对的
分片结果则是第一个物理分片持有头 256 个逻辑分片,第二个物理分片持有紧接着的 256 个逻辑分片,第三个物理分片持有最后 512 个逻辑分片
【配置项】6.partitionLength[] 的元素全部为 1 时,这时候partitionCount 数组和等于 partitionLength 和 partitionCount 的点乘,物理分片和逻辑分片就会一一对应,该分片算法等效于直接取余
【配置项】7.在 rule.xml 中配置标签,从分片索引字段的第几个字符开始截取到第几个字符:
❽ php hash 是可逆的吗
hash 算法是单向密码体制,是不可逆。 希望能帮到你,我还在后盾网上课学习呢现在没时间,有不会的可以问我,加油吧⁽˙³˙⁾◟(๑•́ ₃ •̀๑)◞⁽˙³˙⁾
❾ php hash_hmac跟java算出来的结果不一样
问题解决代码如下:
public String md5(String txt) {
try{
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(txt.getBytes("GBK")); //问题主要出在这里,Java的字符串是unicode编码,不受源码文件的编码影响;而PHP的编码是和源码文件的编码一致,受源码编码影响。
StringBuffer buf=new StringBuffer();
for(byte b:md.digest()){
buf.append(String.format("%02x", b&0xff));
}
return buf.toString();
}catch( Exception e ){
e.printStackTrace();
return null;
}
}
❿ php中hash_init()方法详解
函数原型:
resourcehash_init(string$algo[,int$options=0[,string$key=NULL]])
第二个参数与第三个参数要一起使用,且第二个参数目前只支持HASH_HMAC。
第三个key是在进行 HMAC 哈希运算时传入的“共享密钥”。