Хеш-функция, защищающая от столкновений, а не атак. (Создает случайное пространство результатов размером с UUID)

Использование SHA1 для хеширования строк большего размера, чтобы их можно было использовать в качестве ключей в базе данных.

Попытка создать строку размера UUID из исходной строки, которая является достаточно случайной и достаточно большой для защиты от коллизий, но намного меньшей, чем исходная строка.

Не использовать это ни для чего, связанного с безопасностью.

Пример:

# Take a very long string, hash it down to a smaller string behind the scenes and use
#     the hashed key as the data base primary key instead
def _get_database_key(very_long_key):
    return hashlib.sha1(very_long_key).digest()

Подходит ли SHA1 для этой цели? Или есть что-то более подходящее?


person Chris Dutrow    schedule 03.03.2013    source источник
comment
Вы можете сделать hashlib.sha1(os.urandom(32)).hexdigest() или os.urandom(16).encode('hex'). Вы пытаетесь избежать проверки таблицы на наличие повторяющихся идентификаторов?   -  person Blender    schedule 03.03.2013
comment
А как насчет столкновения? Конечно, это вас все еще волнует.   -  person Eric    schedule 03.03.2013
comment
sha256 или sha512 с меньшей вероятностью вызовут коллизии; у вас есть ограничение по размеру? Также ознакомьтесь с uuid v5 и rfc 4122 и uuid библиотека Python.   -  person Ja͢ck    schedule 03.03.2013


Ответы (1)


У Python есть uuid библиотека, основанная на RFC 4122.

Версия, использующая SHA1, - UUIDv5, поэтому код будет примерно таким:

import uuid

uuid.uuid5(uuid.NAMESPACE_OID, 'your string here')
person Ja͢ck    schedule 03.03.2013