PHP - уникальная функция хеширования, которая состоит всего из 4 цифр (не обязательно должна быть точной)

Я создаю простой сценарий сокращения URL, я хочу хэшировать URL, чтобы он служил в качестве уникального идентификатора, но если бы я использовал что-то вроде MD5, URL был бы не очень коротким.

Есть ли у них какие-то хеширующие функции или в любом случае для создания уникального идентификатора длиной всего 4 или 5 цифр?

6 ответов

Решение

Используйте автоинкрементные целые числа и преобразуйте их в идентификаторы, состоящие из всех букв (строчных и прописных), чтобы сократить их:

function ShortURL($integer, $chr='abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ') {    
// the $chr has all the characters you want to use in the url's;    
    $base = strlen($chr);
// number of characters = base
    $string = '';
    do {
        // start looping through the integer and getting the remainders using the base
        $remainder = $integer % $base;      
        // replace that remainder with the corresponding the $chr using the index
        $string .= $chr[$remainder];
        // reduce the integer with the remainder and divide the sum with the base
        $integer = ($integer - $remainder) / $base;
    } while($integer > 0);

       // continue doing that until integer reaches 0;
    return $string;

}

и соответствующую функцию, чтобы вернуть их к целым числам:

function LongURL($string, $chr='abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ') {
       // this is just reversing everything that was done in the other function, one important thing to note is to use the same $chr as you did in the ShortURL
        $array = array_flip(str_split($chr));

        $base = strlen($chr);
        $integer = 0;
        $length = strlen($string);


        for($c = 0; $c < $length; ++$c) {
            $integer += $array[$string[$c]] * pow($base, $length - $c - 1);
        }
        return $integer;


    }

Хеширование вызовет коллизии. Просто используйте автоинкрементное значение. Это включает использование буквенно-цифровых символов для сжатия. Так работает большинство заменителей URL.

Ответ Никласа ниже чудесно сделан.

Преимущество использования MD5 (или эквивалентных методов) состоит в том, что число возможностей настолько велико, что вы можете предположить, что значение является уникальным. Чтобы гарантировать, что 4-значный случайный идентификатор уникален, потребуется база данных для отслеживания существующих идентификаторов.

По сути, вы должны многократно генерировать идентификаторы и сверяться с БД.

Вы всегда можете просто сохранить первые 5 символов MD5, и, если он уже существует, вы добавляете случайное значение в строку URL и повторяете, пока не получите уникальный.

Я просто скопировал код и запустил его, и кажется, что он строковой функции назад. Я ввел число, сгенерированное в shorturl, подумал и получил другое число. Таким образом, я расшифровал число и обнаружил, что строка должна быть возвращена в длинный URL в обратном порядке с текущей кодировкой выше.

Вот небольшой класс, который делает то, что вы ищете.
http://blog.kevburnsjr.com/php-unique-hash

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