@Dubrovin

Как создать хэш из строки типа md5 с минимальным набором символов a-zA-Z (без цифр) и с минимальными коллизиями?

Есть некая строка, нужно создать хэш строки с минимальным набором символов и коллизий. В хэше не должно быть цифр, спец. символов и т.п., только буквы a-zA-Z.
  • Вопрос задан
  • 983 просмотра
Пригласить эксперта
Ответы на вопрос 4
FanatPHP
@FanatPHP
Чебуратор тега РНР
В выборе "Сложность вопроса" должен быть четвертый пункт

- Сложный
- Средний
- Простой
- Дурацкий
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Два варианта:
1. Посмотрите здесь.
2. Создайте таблицу-связку: [имя css-класса] -> [ID] -> [сочетание на множестве по ID: короткое имя класса]
Ответ написан
@Dubrovin Автор вопроса
В общем я искал альтернативу вот такому коду:
function string_to_short_md5( $string ) {

			$result = '';

			$alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
			$raw      = md5( $string, true );
			$length   = strlen( $this->dec_to_base( $alphabet, 2147483647 ) );

			foreach ( str_split( $raw, 4 ) as $dword ) {
				$dword = ord( $dword[0] ) + ord( $dword[1] ) * 256 + ord( $dword[2] ) * 65536 + ord( $dword[3] ) * 16777216;

				$result .= str_pad( $this->dec_to_base( $alphabet, $dword ), $length, $alphabet[0], STR_PAD_LEFT );
			}

			return $result;
		}

		function dec_to_base( $alphabet, $dword ) {
			$rem = (int) fmod( $dword, strlen( $alphabet ) );
			if ( $dword < strlen( $alphabet ) ) {
				return $alphabet[ $rem ];
			}

			return $this->dec_to_base( $alphabet, ( $dword - $rem ) / strlen( $alphabet ) ) . $alphabet[ $rem ];
		}

Который возвращает md5 строки в base52 (24 символа a-zA-Z).
В результате нашёл более короткое решение:
strtr( base_convert( md5( $string ), 16, 36 ), '0123456789', 'ABCDEFGHIJ' );

Которое возвращает md5 строки в base36 (24-25 символов a-zA-Z).

Всем спасибо за помощь!
Ответ написан
Комментировать
anton_reut
@anton_reut
Начинающий веб-разработчик
Создай массив-словарь из нужных букв и потом методом shuffle генери случайные наборы по этому словарю. Либо при помощи rand() делаем случайное число из Индексов словаря, а потом берем значения по этим индексам.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы