Здравствуйте, dshe, Вы писали:
D>Здравствуйте, unkis, Вы писали:
U>>Здравствуйте, Blazkowicz, Вы писали:
B>>>Здравствуйте, unkis, Вы писали:
U>>>>А можно немножко поп подробней про MD5, я что-то не понял почему они ьогут быть одинаковыми? B>>>Тю, это же логика. B>>>1) Множество всех строк больше чем множество всех их MD5 hash кодов. Это надо объяснять почему? U>>извини за глупость, но всё же хотелось бы услышать D>сколько различных MD5 кодов может быть? 2^128 (длина digest'а 128 bit = 16 байт) D>сколько различных строк может быть? если предположить, что символ это 1 байт, количество различных строк длиною 16 байт будет тоже 2^128. Но кроме строк длиною 16 байт существуют строки длиною 15 байт, 14 байт, 0 байт а также 17 байт, 18 байт... Получается, что мощность множества всех строк строго больше мощности множества всех MD5 кодов. Следовательно взаимно однозначного отображения между ними быть не может.
U>>А как насчёт SHA алгоритма, там как дела обстоят с этим? D>Точно так же. Как и с любым другим digest'ом.
вот блин а как же тогда решить такую проблему?
Есть какие-то идеи?
Здравствуйте, unkis, Вы писали:
U>>>А как насчёт SHA алгоритма, там как дела обстоят с этим? D>>Точно так же. Как и с любым другим digest'ом.
U>вот блин а как же тогда решить такую проблему? U>Есть какие-то идеи?
Так а в чем проблема? Как я понял, MD5 используется для ускорения выборки из СУБД. Для этого он хорошо будет работать. Достаточно дополнительно вставить проверку по всем значащим полям (в select или в java-коде после загрузки объекта).
Здравствуйте, danila.master, Вы писали:
DM>Здравствуйте, unkis, Вы писали:
U>>>>А как насчёт SHA алгоритма, там как дела обстоят с этим? D>>>Точно так же. Как и с любым другим digest'ом.
U>>вот блин а как же тогда решить такую проблему? U>>Есть какие-то идеи?
DM>Так а в чем проблема? Как я понял, MD5 используется для ускорения выборки из СУБД. Для этого он хорошо будет работать. Достаточно дополнительно вставить проверку по всем значащим полям (в select или в java-коде после загрузки объекта).
А как вы думаете, могут ли быть грабли, если сделать следующее:
В место подписи SHA1, генерировать id просто объединяя строки.
К примеру, есть атрибуты A,B,C,D, так вот id будет равен "A-B-C-D"
интересно какие грабли могут быть в таком варианте?
Здравствуйте, unkis, Вы писали:
U>А как вы думаете, могут ли быть грабли, если сделать следующее: U>В место подписи SHA1, генерировать id просто объединяя строки. U>К примеру, есть атрибуты A,B,C,D, так вот id будет равен "A-B-C-D" U>интересно какие грабли могут быть в таком варианте?
Маленькие грабельки:
A="a-x"
B="b"
и
A="a"
B="x-b"
После объединения дадут одинаковую строчку "a-x-b". Легко обходятся если есть символ, который заведомо не встречается в исходных строках, и не так легко если такого символа нет.
Так а чем вам не нравится вариант с MD5? Дополнительной проверкой в java-коде?
RT>Маленькие грабельки: RT>A="a-x" RT>B="b" RT>и RT>A="a" RT>B="x-b" RT>После объединения дадут одинаковую строчку "a-x-b". Легко обходятся если есть символ, который заведомо не встречается в исходных строках, и не так легко если такого символа нет.
RT>Так а чем вам не нравится вариант с MD5? Дополнительной проверкой в java-коде?
А не нравится мне это по следующей причине.
К примеру, я создаю новый объект, генерирую ключ, получаю md5, далее, делаю выборку по этому ключу, получаю объект из БД, сравниваю все атрибуты и вижу что ключ одинаковый, а поля не совпадают. и вот тут возникает вопрос, что сделать с моим(созданным) объектом?
Есть идеи?
Здравствуйте, unkis, Вы писали:
RT>>Так а чем вам не нравится вариант с MD5? Дополнительной проверкой в java-коде? U>А не нравится мне это по следующей причине. U>К примеру, я создаю новый объект, генерирую ключ, получаю md5, далее, делаю выборку по этому ключу, получаю объект из БД, сравниваю все атрибуты и вижу что ключ одинаковый, а поля не совпадают. и вот тут возникает вопрос, что сделать с моим(созданным) объектом? U>Есть идеи?
Кладете его в базу и не напрягаетесь лишний раз по этому поводу
В следующий раз, когда будете искать объект по md5 select (ну или EJBQuery) вернет вам два объекта и сравнив остальные поля вы выберете нужный экземпляр. Да и вобще, за время жизни вашей программы это пренеприятнейшее событие произойдет от силы несколько раз (а скорее всего вообще ни разу).
Здравствуйте, unkis, Вы писали:
RT>>Кладете его в базу и не напрягаетесь лишний раз по этому поводу
U>как же я его положу в базу, если у меня md5 является ключом? база будет против иметь два одинаковых значения .
короче так:
create table t (
sha1hash char(40),
col01 number,
col02 number,
col03 number,
primary key (col01, col02, col03)
);
create index sha1hash_idx on t(sha1hash);
....
select * from t where sha1hash = ? and col01 = ? and col02 = ? and col03 = ?
примерно так надо делать выборку. это будет быстро т.к. sha1hash_idx индекс высокоселективный.