Более быстрый хэш с меньшим количеством коллизий? - PullRequest
2 голосов
/ 05 ноября 2011

Какая форма хеширования выдаст самые быстрые результаты (и наименьший шанс того, что 2 результата вернут одинаковый хеш) при суммировании хеша всех строк (10 миллионов) для одного столбца (это могут быть NUMBER, VARCHAR, DATE, TIMESTAMP, но нет CLOBS, XML.etc)? Затем это значение будет сравниваться с той же операцией в другой таблице, чтобы проверить, все ли строки для этого же столбца в точности совпадают.

 SET SERVEROUTPUT ON
DECLARE
 HASH_VAL NUMBER;
begin
DBMS_OUTPUT.PUT_LINE (OWA_OPT_LOCK.CHECKSUM('column_here'));
DBMS_OUTPUT.PUT_LINE (DBMS_UTILITY.GET_HASH_VALUE('column_here',1,POWER(2,31)-1));
EXECUTE IMMEDIATE 'SELECT ORA_HASH(''column_here'') FROM DUAL' INTO HASH_VAL;
DBMS_OUTPUT.PUT_LINE (HASH_VAL);
DBMS_OUTPUT.PUT_LINE (DBMS_OBFUSCATION_TOOLKIT.MD5( INPUT_STRING => 'column_here'));
DBMS_OUTPUT.PUT_LINE ( DBMS_CRYPTO.HASH(UTL_RAW.CAST_TO_RAW('column_here'),3) );
END;
/

1 Ответ

4 голосов
/ 05 ноября 2011

Какой метод быстрее?

Я не отмечал это на стенде, но я бы предположил, что 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.

...