Какой метод быстрее?
Я не отмечал это на стенде, но я бы предположил, что DBMS_SQLHASH - самый быстрый, поскольку он был создан именно для такого типа проблем.
Это официальный пакет, но недостаточно документированный в Руководстве по безопасности .Его нет на странице 5,964 (!) Справочник по пакетам и типам PL / SQL , и вам нужно grant execute on dbms_sqlhash to [user];
, чтобы он заработал, поэтому, вероятно, об этом почти никто не слышал.
Например:
select sys.DBMS_SQLHASH.GETHASH(sqltext=>'select 1 from dual', digest_type=>1)
from dual;
digest_type: 1 = HASH_MD4, 2 = HASH_MD5, 3 = HASH_SH1
Вероятность столкновения
Естьнекоторые вопросы о вероятности коллизии: Hash Collision - каковы шансы? , Могут ли две разные строки генерировать один и тот же хэш-код MD5?
I'mточно не знаю, что случится с шансом, когда вы начнете суммировать много строк, но вероятность одного столкновения настолько смехотворно мала, что вы, вероятно, в порядке.
Я не знаю математику, но яуверен, что наиболее вероятной причиной коллизии является ошибка программирования, если вы пытаетесь написать свою собственную функцию.
Я видел и создавал скрипты, подобные этому, и есть много тонких способов испортить это.,Например, нулевые значения и значения обмена между строками или столбцами.Несмотря на то, что вы сейчас используете только один столбец, для того, чтобы кто-то никогда не писал один из этих уродливых сценариев, вы должны по возможности использовать поставляемый пакет Oracle.