2

Мне нужно создать хэш-ключ на моих столах для уникальности, и кто-то сказал мне о md5. Но я прочитал о контрольной сумме и двоичной сумме; не будет ли это той же целью? Чтобы не было дубликатов в определенной области. Теперь мне удалось реализовать это, и я вижу ключи хэша в своих таблицах. Нужно ли мне изменять исходные ключи, созданные с момента создания нового ключа индекса с помощью этих хеш-ключей? Также мне нужно сменить ключи? Как мне изменить свои запросы, например, инструкции SELECT? Я догадываюсь, что я до сих пор не уверен, что ключи хэша действительно помогают в запросах, кроме уникальности?hash functions-sql studio express

ответ

1

Всегда есть функция HashBytes(). Он поддерживает md5, но если вам не нравится, есть опция для sha1.

А как это может помочь запросам: один простой пример: если у вас есть большой VARCHAR столбец — возможно VARCHAR макс — и в вашем запросе вы хотите знать, если содержимое этого столбца соответствует заданной строке. Если вам нужно сравнить свой поиск с каждой отдельной записью, это может быть медленным. Но если вы используете хэш-строку поиска и используете ее, все может пойти намного быстрее, так как теперь это всего лишь очень короткое двоичное сравнение.

+0

Спасибо. Что помогает. Я реализовал функцию md5 через пользовательскую функцию sql-сервера, и она работает. Итак, с вашего поста я могу предположить, что хеш-ключи не влияют на выбор первичных ключей?Первоначально у меня были уникальные автоматически увеличивающиеся ключи в качестве первичных ключей для моей таблицы, и единственное, что я изменил после реализации хеш-функции, - это создать индекс в том же поле, которое используется в хэш-функции. Также, если бы были выборки из 1 или более таблиц с использованием базового запроса для соответствия первичному и внешнему ключам, то я бы не использовал хэш-ключ явно правильно? – vbNewbie

+0

только в случае попытки совпадения запроса на основе строкового поля, используемого в хеш-функции. – vbNewbie

2

Если ваша цель - не содержать дубликатов в определенном поле, почему бы просто не применить уникальный индекс к этому полю и позволить движку базы данных делать то, что он должен был делать?

+0

Я сделал, и это прост в использовании; но мой руководитель группы хочет использовать хэш-ключ, поскольку таблицы будут содержать сотни тысяч записей, проиндексированных строковым полем. – vbNewbie

+0

@vbNewbie: ваша команда - это маппет. @Quick Joe Smith: perfect – gbn

+0

спасибо gbn, я согласен, но так как я новый парень ... – vbNewbie

2

Нет смысла писать уникальную функцию для замены уникальных ограничений/индексов SQL Server.

Как вы собираетесь гарантировать, что хэш уникален? С ограничением?

Если вы указали его (что может быть недопустимо из-за детерминизма), то оптимизатор будет рассматривать его как не уникальный. Также как и убийство.

И у вас есть только несколько 100 000 строк. Арахис.

Учитывая время я мог придумать больше аргументов, но я буду резюмировать: Не делают это

+0

Итак, в чем цель md5 и других хеш-функций помимо криптографии - я понимаю основное использование индексов SQL-сервера и т. Д. хорошо служил мне в других приложениях, но у меня нет выбора здесь. Или он имел в виду что-то еще; возможно, реализация некоторой хеш-функции в моем скрипте vb, чтобы избежать дубликатов, но которая все еще избегает индексов и ограничений sql, правильно? О, и это на самом деле миллионы записей – vbNewbie

+0

Я понятия не имею, почему у вас есть это требование. Но если для управления уникальными значениями в таблице базы данных это неправильное решение. У меня есть 10 (или около того) столбцов уникальный индекс на 200 миллионов строк таблицы ... – gbn

0

Криптографически сохранить функции хеширования являются одним из способов функции, и они потребляют больше ресурсов (циклы CPU), что функции которые не являются криптографически безопасными. Если вам просто нужна функция как хэш-ключ, вам не нужно такое свойство. Все, что вам нужно, - это низкая вероятность столкновения, что связано с единообразием. Попробуйте использовать CRC или если у вас есть строки или по модулю для чисел.

http://en.wikipedia.org/wiki/Hash_function

0

почему бы вам не использовать GUID с дефолтом NEWSEQUENTIALID() ..don't использовать NEWID(), так как это ужасно для кластеризации, смотрите здесь: Best Practice: Do not cluster on UniqueIdentifier when you use NewId

сделать это столбец первичный ключ, и вы в значительной степени сделали