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

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

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

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

7 ответов

Решение

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

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

$hash = substr(md5($num), 0, 8);
>>> math.exp(math.log(40000)/8)
3.7606030930863934

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

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

Начиная с PHP 8.1 вы можете использовать xxHash для получения 8-символьного хэша любой строковой или числовой переменной.

      $number = random_int(1, 40_000);
$hash = hash('xxh32', (string) $number);

var_dump($hash); // Output is string(8) "af863d37"

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

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

один пример

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

Итак, вы хотите преобразовать шестизначное число в восьмеричное число?

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

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

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

C.

Другие вопросы по тегам