Есть ли способ принять любое число, скажем, от 1 до 40000 и создать хэш-символ с 8 символами?
Я думал об использовании base_convert
но не мог понять, как заставить его быть 8-символьным хэшем.
Любая помощь будет оценена!
Почему бы вам просто не запустить md5
и взять первые 8 символов?
Поскольку вы хотите хеш, неважно, отбрасываются ли части, а скорее, что один и тот же вход будет выдавать один и тот же хеш.
$hash = substr(md5($num), 0, 8);
>>> math.exp(math.log(40000)/8) 3.7606030930863934
Поэтому вам нужно 4 символа-цифры для создания 8-символьного хеша с 40000:
sprintf("%08s", base_convert($n, 10, 4))
Для 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);
Есть много способов …
один пример
$x = ? $s = ''; for ($i=0;$i<8;++$i) { $s .= chr( $x%26 + ord('a') ); $x /= 26; }
$hash = substr(hash("sha256",$num), 0, 8);
Итак, вы хотите преобразовать 6-значное число в 8-разрядную строку воспроизводимо?
sprintf("%08d", $number);
Конечно, хэш не обратим – но без соли / IV это может быть немного легко взломать. Лучшее решение может быть:
substr(sha1($number . $some_secret),0,8);
C.