Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Сколько цифр в 64 битах?
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » Сколько цифр в 64 битах?

Страниц (1): [1]
 

1. nkl - 16 Октября, 2014 - 09:13:01 - перейти к сообщению
Всем привет, мне нужен надежный цифровой хэш для строк в БД, который будет генериться по совокупности данных из нескольких столбцов этой таблицы, что бы потом при обновлении другой таблицы проверять, если хэш изменился, значит и данные изменились, значит эту строку нужно обновит, если нет, то на нет и суда нет.
Почему именно цифровой? Компу быстрее сравнивать цифры чем буквы.
Вот тут товарищ предлагает собственный класс для генерации crc64 хэша.
Почему именно crc64? Потому что нативная php crc32() генерирует crc32-хэш, который может быть подвержен коллизиям (для разных наборов данных может быть сгенерирован один и тот же хэш), что не всегда безопасно.
Проблема вот в чем, как хранить этот crc64-хэш? И если не crc64, то может кто что подскажет? Как лучше организовать подобную проверку изменений в исходной строке? Растерялся
2. Мелкий - 16 Октября, 2014 - 09:28:13 - перейти к сообщению
bigint
8 байт, 64 бита.

nkl пишет:
для разных наборов данных может быть сгенерирован один и тот же хэш

Это свойство любых хэшей.
Коллизии будут, коллизии будут всегда. Вопрос и различие только в их количестве. Которое напрямую зависит от объёма занимаемым хэшом места.
3. nkl - 16 Октября, 2014 - 10:44:46 - перейти к сообщению
Блин, какую-то фигню выдает класс автора 488c08c3e93f9c6a или 743d18d97d6497f3 - это же на bigint я так понимаю?
(Добавление)
А есть ли в природе нормальна цифровая (only digit) хэш функция максимально устойчивая к коллизиям?
(Добавление)
ЗЫ
Конечно можно конвертить это 16-ричное число в десятичное, но имхо проще уже тогда забыть про эту хрень и взять sha1 или md5 Нахмурился

ЗЫЫ
Может когда-то в будущем, когда это начнет серьезно сказываться на производительности придется написать свою)
4. Sail - 16 Октября, 2014 - 11:20:54 - перейти к сообщению
Мелкий пишет:
Вопрос и различие только в их количестве. Которое напрямую зависит от объёма занимаемым хэшом места.
В школе, помнится, употреблялся термин "обратно пропорционально" Закатив глазки
nkl пишет:
Блин, какую-то фигню выдает класс автора 488c08c3e93f9c6a или 743d18d97d6497f3 - это же на bigint я так понимаю?

Обычные шестнадцатеричные числа...
5. Мелкий - 16 Октября, 2014 - 11:35:36 - перейти к сообщению
nkl пишет:
488c08c3e93f9c6a или 743d18d97d6497f3 - это же на bigint я так понимаю?

Число из 16 шестнадцатеричных чисел, 8 байт информации и есть.

nkl пишет:
нормальна цифровая

Они все бинарные.
Цифры, буквы - только отображение. Сами хэши бинарны. SHA1 - 20 байт, md5 - 16, crc64 - 8, crc32 - 4 байта (обычно их в битах измеряют, правда).
Чем больше информации в хэше - тем математически ниже вероятность коллизии. Но нулём эта вероятность не будет вплоть до размера, равного или превышающего размер исходных данных.
Ещё раз - хеши по своему определению имеют коллизии! Решайте свою задачу другим способом.
6. Sail - 16 Октября, 2014 - 11:56:59 - перейти к сообщению
nkl пишет:
если хэш изменился, значит и данные изменились, значит эту строку нужно обновить, если нет, то на нет и суда нет

Угу... соглашусь с предыдущим оратором...
Если хэш не изменился, то для полной уверенности в том, что данные не изменились, надо сравнивать данные.

 

Powered by ExBB FM 1.0 RC1