crc32() vs. md5()

su1d

Старожил PHPClubа
crc32() vs. md5()

Задача:
Надо хранить в таблице уникальный идентификатор файла.
Имя файла не подходит, т.к. его длина зараннее неизвестна, и может быть чересчур большой. Как оптимальный вариант подходит crc32() от имени файла, т.к. эта функция возвращает int.

Вопрос:
Насколько можно быть уверенным, что не будет совпадений результата CRC32 по именам разных файлов? Для полной уверенности можно бы использовать md5(), но не хочется связываться со строками.
 

EkyT

Guest
а если вместо имени файла хранить его inode?
 

su1d

Старожил PHPClubа
2admin: как я уже писал, с md5() пока не сильно хочется связываться

2EkyT: пострадает переносимость проекта. хэшить-то я буду относительный путь от каталога проекта, а с инодой значение всегда будет просто непредсказуемое.
 

.des.

Поставил пиво кому надо ;-)
просто crc32 я бы не советовал... достаточно большое множество при маленьких длин строк.. хотя ты же не для Пентагона пишешь :)
может попробуешь crc32(md5($fname));

теория здесь: http://cydem.zp.ua:10002/hack/tech_hack/HACKBOOK/crypt.htm
 

EkyT

Guest
ну по поводу совпадений в crc32 вот что пишут разработчики mnogosearch например:

According to our tests there are only 250 pairs of words have the same CRC in the list of about 1.600.000 unique words.
 

.des.

Поставил пиво кому надо ;-)
1600000 это не такое большое число для файлов на современных дисках.. а прогресс семимильными шагами
так что это уверенности не прибавляет
 

su1d

Старожил PHPClubа
According to our tests there are only 250 pairs of words have the same CRC in the list of about 1.600.000 unique words
наверное это именно то, что меня интересовало. спасибо.
так или иначе, предположительное кол-во файлов будет составлять лишь два-три десятка (это страницы сайта).

попробую значит юзать crc32(md5()), чтобы параметр crc32() был максимально разным (в некоторых именах файлов совпадают каталоги), а если/когда полезут косяки, буду уже думать как их исправлять. =)

всем спасибо.
 

Макс

Старожил PHPClub
А вариант типа hexdec(md5($str)); сразу заплюют ?
Числа конечно большие получатся
 

.des.

Поставил пиво кому надо ;-)
2-3 десятка su1d :) можешь даже не заморачиваться с md5 просто crc32 гарантированно совпадений не будет при 2-3 тысячах.
 

sapenov

Guest
su1d
а просто последовательно нумеровать ?
быстро и уникально :)

0
1
2
3
4
...
32
 

Mammoth

Guest
> а просто последовательно нумеровать ?

Что нумеровать? Ты предлагаешь написать свою хеш-функцию?
 

.des.

Поставил пиво кому надо ;-)
Mammoth нет он просто предлагает решить изначальную задачу su1d
Задача:
Надо хранить в таблице уникальный идентификатор файла.
вот sapenov и говорит а зачем собственно md5 :)
 

Mammoth

Guest
> вот sapenov и говорит а зачем собственно md5

В этом случае придется хранить еще и соответствие <имя_файла> <-> <UID_файла>...
 

Mammoth

Guest
> не.. мне нада, чтобы функция зависела от файла (модуля), а не от системы. =)

Тогда если будешь брать хеш от полного пути до файла, не забудь про отличия между FAT и ext. ('c:\'+'\' & '/')
 

su1d

Старожил PHPClubа
угу.. это уже предусмотрено =) спасибо

а пути не полные, а относительные в базовом каталоге проекта.
 

woland

Guest
Полиминал строки crc32() иногда возвращает цифры, начинающиеся со знака "-". Об этом тоже не надо забывать.
 
Сверху