PHP - генерирует 8-символьный хэш из целого числа - PullRequest
6 голосов
/ 26 марта 2010

Есть ли способ взять любое число, скажем, от 1 до 40000 и сгенерировать хэш из 8 символов?

Я думал об использовании base_convert, но не мог придумать, как заставить его быть хешем из 8 символов.

Любая помощь будет оценена!

Ответы [ 6 ]

23 голосов
/ 26 марта 2010

Почему бы вам просто не запустить md5 и не взять первые 8 символов?

Поскольку вам нужен хеш, не имеет значения, отбрасываются ли части, а скорее то, что один и тот же вход будет создавать тот же хеш.

$hash = substr(md5($num), 0, 8);
4 голосов
/ 26 марта 2010
>>> math.exp(math.log(40000)/8)
3.7606030930863934

Следовательно, для получения 8-значного хеша из 40000 вам нужно 4 цифровых символа:

sprintf("%08s", base_convert($n, 10, 4))
1 голос
/ 12 июня 2012

Для 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

0 голосов
/ 26 марта 2010

То есть вы хотите преобразовать шестизначное число в восьмеричное число?? 1001 *

sprintf("%08d", $number);

Конечно, хэш необратим, но без соли / IV это может быть немного легко взломать. Лучшее решение может быть:

substr(sha1($number . $some_secret),0,8);

C.

0 голосов
/ 26 марта 2010
$hash = substr(hash("sha256",$num), 0, 8);
0 голосов
/ 26 марта 2010

Есть много способов ...

один пример

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