PHP - 从一个整数生成一个8字符的散列

问题描述:

有没有一种方法可以从例如1到40000取一个数字并生成8个字符的散列?PHP - 从一个整数生成一个8字符的散列

我正在考虑使用base_convert,但无法找到强制它成为8字符散列的方法。

任何帮助,将不胜感激!

为什么不运行md5并取前8个字符?

因为你想要一个散列,所以丢弃部分并不重要,而是相同的输入会产生相同的散列。

$hash = substr(md5($num), 0, 8); 
+3

感谢谁固定的。我一定睡着了。 – 2010-03-26 02:25:28

+3

我的号码范围内是否有碰撞的机会? – doc 2010-03-26 02:31:58

+0

更好的直觉告诉我不......但你可能想要进行测试。由于40,000不是一个庞大的数字,你可以很容易地测试。 – 2010-03-26 02:44:30

的方法有很多...

一个例子

$x = ? 
$s = ''; 
for ($i=0;$i<8;++$i) 
{ 
    $s .= chr($x%26 + ord('a')); 
    $x /= 26; 
} 
+0

是不是只是有效地改变数字的基础? – nickf 2010-03-26 02:25:11

+0

当然。但请求非常模糊 - 它只是要求一个8char散列。 – SteelBytes 2010-03-26 02:26:24

+0

对不起,我隐约地问了一个问题:(我试图从任何整数生成一个8字符的散列,但不只是想用剩下的长度来填充散列,有什么想法吗? – doc 2010-03-26 02:34:44

$hash = substr(hash("sha256",$num), 0, 8); 
+0

这是怎么回事?我的'md5'非常强大,为什么'sha256'? – 2010-03-26 02:28:44

+0

@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); 

http://snipplr.com/view.php?codeview&id=20236