PHP - 从一个整数生成一个8字符的散列
有没有一种方法可以从例如1到40000取一个数字并生成8个字符的散列?PHP - 从一个整数生成一个8字符的散列
我正在考虑使用base_convert
,但无法找到强制它成为8字符散列的方法。
任何帮助,将不胜感激!
为什么不运行md5
并取前8个字符?
因为你想要一个散列,所以丢弃部分并不重要,而是相同的输入会产生相同的散列。
$hash = substr(md5($num), 0, 8);
的方法有很多...
一个例子
$x = ?
$s = '';
for ($i=0;$i<8;++$i)
{
$s .= chr($x%26 + ord('a'));
$x /= 26;
}
是不是只是有效地改变数字的基础? – nickf 2010-03-26 02:25:11
当然。但请求非常模糊 - 它只是要求一个8char散列。 – SteelBytes 2010-03-26 02:26:24
对不起,我隐约地问了一个问题:(我试图从任何整数生成一个8字符的散列,但不只是想用剩下的长度来填充散列,有什么想法吗? – doc 2010-03-26 02:34:44
$hash = substr(hash("sha256",$num), 0, 8);
这是怎么回事?我的'md5'非常强大,为什么'sha256'? – 2010-03-26 02:28:44
@GeorgeEdison:md5非常弱,需要几个小时才能产生冲突。 – neo 2010-03-26 16:02:34
>>> math.exp(math.log(40000)/8)
3.7606030930863934
因此,你需要4位数的符号从40000产生8个字符的哈希值:
sprintf("%08s", base_convert($n, 10, 4))
那么你想要将一个6位数的数字转换为8位数的字符串吗?
sprintf("%08d", $number);
当然哈希是不可逆的 - 但没有盐/ IV它可能有点容易入侵。一个更好的解决方案可能是:
substr(sha1($number . $some_secret),0,8);
C.
为PHP:
$seed = 'JvKnrQWPsThuJteNQAuH';
$hash = sha1(uniqid($seed . mt_rand(), true));
# To get a shorter version of the hash, just use substr
$hash = substr($hash, 0, 10);
感谢谁固定的。我一定睡着了。 – 2010-03-26 02:25:28
我的号码范围内是否有碰撞的机会? – doc 2010-03-26 02:31:58
更好的直觉告诉我不......但你可能想要进行测试。由于40,000不是一个庞大的数字,你可以很容易地测试。 – 2010-03-26 02:44:30