2010-07-05 1 views
2

Я работаю над проектом, где мне нужно использовать некоторую хэш-функцию для создания хеш-строки. Эта хэш-строка должна быть уникальной, состоит из 6-13 символов (фиксированная длина).Как сгенерировать хэш-строку с некоторыми специальными правилами в PHP?

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

Мне нужна эта хэш-строка, состоящая только из допустимых символов (0-9 a-z A-Z).

Какую функцию хеша использовать для достижения этой цели? Как я могу генерировать такие хэш-строки?

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

+0

Нужно ли быть хешем? Как насчет генерации строки с произвольными рисунками? –

+2

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

+0

@Felix: как генерировать случайные строки без столкновения? @Gareth: Точная уникальность невозможна, вы знаете, но вероятность вероятности столкновения как можно ниже - это мое значение по уникальности. –

ответ

2

Использование склепа:

$hash = crypt("somevaluetohash", $uniqueid); 

Уникальный идентификатор представляет собой соль, так что вы можете создавать различные значения в зависимости от идентификатора. Поэтому, если у одного пользователя был пароль «somevaluetohash», а у другого пользователя был тот же, конечный хэш не был бы таким же.

+0

Я планировал использовать его, но он генерирует некоторые специальные символы, такие как точка, косая черта и т. Д. Я хочу, чтобы строка содержала только буквенно-цифровые символы. –

+1

Вы всегда можете сделать фильтр для этого.Или вы можете сделать хэш с $ hash = md5 ("somevaluetohash". $ Uniqueid); – nebkat

+0

Ваша идея хорошая. но могу ли я как-то уменьшить длину сгенерированного кода до 6 или 13 (не используя простой обрез). –

0
<?php 
    $id; 
    $hash_full = md5($id); //hash('sha256', $id); 
    $hash_cropped = substr($hash_full, 0, 6); 
?> 

Использование hash() для других алгоритмов хэширования.

Для чего нужны эти хеши? Для меня не имеет смысла генерировать хэш из идентификатора, не могли бы вы просто использовать идентификатор?

+0

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

0

Нужно ли быть криптографической контрольной суммой? Или подходит простая контрольная сумма? Не подходит ли первичный ключ для базы данных?

У вас есть много вариантов, от самых простых crc32 до самых продвинутых sha512.

Но если вы делаете это для определенного приложения (например, filesystem hashing, или finding nearby objects, используя некоторые показатели), тогда вам нужно будет указать больше своей проблемы.

Смежные вопросы