PHP-从整数生成8个字符的哈希

PHP-从整数生成8个字符的哈希,php,hash,base-conversion,Php,Hash,Base Conversion,有没有一种方法可以取1到40000之间的任何数字并生成一个8个字符的散列 我曾考虑使用base\u convert,但无法找到一种方法将其强制为8个字符的散列 任何帮助都将不胜感激 为什么不运行md5并获取前8个字符 因为您需要散列,所以是否丢弃部分并不重要,而是相同的输入将产生相同的散列 $hash = substr(md5($num), 0, 8); 有很多方法 一个例子 $x = ? $s = ''; for ($i=0;$i<8;++$i) { $s .= chr( $x

有没有一种方法可以取1到40000之间的任何数字并生成一个8个字符的散列

我曾考虑使用
base\u 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;
}
$x=?
$s='';
对于($i=0;$i)
因此,您需要4位数字符号从40000生成8个字符的哈希:

sprintf("%08s", base_convert($n, 10, 4))

那么你想把一个6位数的数字转换成一个8位数的字符串吗

sprintf("%08d", $number);
当然,哈希是不可逆的,但如果没有salt/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);

这不是在有效地改变数字的基数吗?当然。但是请求很模糊-它只是要求一个8字符的哈希。很抱歉,我问的问题太模糊了:(我正试图从任何整数生成一个8个字符的散列,但不只是想用一些东西填充散列的剩余长度。有什么想法吗?多亏了修复它的人。我一定是睡着了。在我的数字范围内有可能发生冲突吗?更好的直觉告诉我没有……但你可能想运行一个测试。因为40000不是一个很大的数字,你可以很容易地测试它。谢谢,我现在用一个与会话相关联的随机哈希来测试它。这和我的有什么不同?
md5
非常强大。为什么
sha256
?@GeorgeEdison:md5非常弱。创建冲突只需要几个小时。嘿,这可以让你清楚哪一个最适合
base\u convert
,你可以对于您的数字范围,最多可使用3个字符(!)。如果您总是需要8个字符,则可能需要。您可能需要预先指定前导零(或其他字符),但即使MD5的子字符串也可以有前导零(尽管概率较低)。
substr(sha1($number . $some_secret),0,8);
$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);