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

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

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

Ответы [ 5 ]

3 голосов
/ 17 июня 2011

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

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;


    }
3 голосов
/ 17 июня 2011

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

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

0 голосов
/ 17 июля 2011

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

0 голосов
/ 17 июня 2011

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

0 голосов
/ 17 июня 2011

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

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

...