Сейчас на форуме: (+2 невидимых) |
![]() |
eXeL@B —› Оффтоп —› Хэширование без коллизий |
Посл.ответ | Сообщение |
|
Создано: 22 мая 2011 01:15 · Поправил: 4kusNick · Личное сообщение · #1 Привет, ищу наиболее эффективный алгоритм хэширования по соотношению производительность\устойчивость к коллизиям\минимальный размер данных на выходе %) То есть, никакой криптостойкости или вроде того не нужно вообще - задача захэшировать огромное количество разных id с максимальной гарантией, что хэши не повторятся, и соответственно, на приемлемой скорости, да так, чтобы полученные хэши потом можно было свободно использовать как имена файлов (отсюда - пожелания к размеру данных - в некоторых осях есть ограничения на длину имени файла). Пока смотрю в сторону md5\sha, как думаете - подойдут они тут, или есть что-то более подходящее? ----- Флэш, ява, дотнет - на завтрак, обед и ужин. Unity3D на закуску. ![]() |
|
Создано: 22 мая 2011 06:54 · Личное сообщение · #2 |
|
Создано: 22 мая 2011 09:03 · Личное сообщение · #3 CityHash128. Очень быстрый, но криптографически нестойкий. ----- PGP key ![]() |
|
Создано: 22 мая 2011 09:57 · Личное сообщение · #4 |
|
Создано: 22 мая 2011 11:12 · Личное сообщение · #5 Специально можно найти коллизию, но полагаю что на обычных наборах данных при 128 бит длине хэша коллизий не будет. Если нужно что-то очень быстрое и криптографически стойкое, то советую обратить внимание на ECHO hash ----- PGP key ![]() |
|
Создано: 22 мая 2011 20:12 · Личное сообщение · #6 |
|
Создано: 22 мая 2011 21:41 · Личное сообщение · #7 ntldr пишет: но полагаю что на обычных наборах данных при 128 бит длине хэша коллизий не будет. на обычных данных и у md5 не будет в 99,8%, особенно, если данные не бинарные, а ограниченные алфавитом, а т.к. нужно id, то не думаю, что стоит беспокоиться приведите пример 2х чисел из интервала 0..10^12 с одинаковым md5 ![]() ----- z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh ![]() |
|
Создано: 23 мая 2011 06:17 · Личное сообщение · #8 |
|
Создано: 23 мая 2011 13:16 · Личное сообщение · #9 Magister Yoda пишет: он говорит про количество, не обязательно, что даже id входят в этот промежуток. Ну как же? он именно про id говорил 4kusNick пишет: То есть, никакой криптостойкости или вроде того не нужно вообще - задача захэшировать огромное количество разных id с максимальной гарантией, что хэши не повторятся ----- z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh ![]() |
|
Создано: 23 мая 2011 13:53 · Личное сообщение · #10 Если диапазон id ограничен, то зачем вообще хэш, проще напрямую использовать id и не беспокоиться насчет коллизий. Если из id нужно получить нечто псевдослучайно выглядящее и длина id <= 128 бит, то можно шифровать id любым блочным шифром с нулевым ключом (или применить любую другую обратимую функцию), получим "хэш" гарантированно без коллизий. ----- PGP key ![]() |
|
Создано: 23 мая 2011 13:54 · Поправил: Azur1d · Личное сообщение · #11 |
|
Создано: 23 мая 2011 19:17 · Поправил: 4kusNick · Личное сообщение · #12 Isaev ntldr Azur1d Прошу прощения, что сразу не объяснил - под id я подразумевал записи вида $55eggg^:cdvhg/ffd5435/m.,<.d5gt /d/gfhhd\567]fvgnb %vbbg/uu54.64>?4 и т.д., то есть там каждый "id" может быть сформирован в виде любого набора символов (в том числе, и не из алфавита), длиной от 1 до 1000, и они не могу повторяться, то есть каждый "id" - уникален, напрямую их использовать не выйдет, т.к. нужно сопоставлять им имена файлов в разных операционках. ntldr А на счёт блочных шифров - эта идея ещё актуальна, с учётом вышесказанного? Если да, то будет ли оно по производительности на уровне хэш-алгоритмов md5\sha или даже CityHash? ----- Флэш, ява, дотнет - на завтрак, обед и ужин. Unity3D на закуску. ![]() |
|
Создано: 23 мая 2011 20:28 · Личное сообщение · #13 4kusNick пишет: А на счёт блочных шифров - эта идея ещё актуальна, с учётом вышесказанного? Не актуальна, т.к. в общем случае нельзя однозначно отобразить большее множество на меньшее. Если хотите гарантированно без коллизий - конструируйте perfect hash функцию для своего заранее известного набора ключей. Может быть С perfect hash можно без проблем уложиться в 64 бита без коллизий (обычный 64 битный хэш скорее всего будет иметь коллизии на вашем наборе ключей). Ну и наконец - если набор ключей не определен, т.е. нет возможности сгенерировать и проверить все варианты, то не существует способов хэширования гарантированно без коллизий. ----- PGP key ![]() |
|
Создано: 25 мая 2011 11:16 · Личное сообщение · #14 ntldr Понятно, спасибо за идею с perfect hash - возьму на вооружение. Набор ключей определён, то есть есть возможность на одном и том же наборе несколько разных алгоритмов попробовать и потестировать на коллизии. Всем большое спасибо за ценные советы и помощь, дальше я уже сам. ----- Флэш, ява, дотнет - на завтрак, обед и ужин. Unity3D на закуску. ![]() |
![]() |
eXeL@B —› Оффтоп —› Хэширование без коллизий |