Vilken metod är snabbare?
Jag har inte bänkmärkt detta, men jag skulle gissa att DBMS_SQLHASH är den snabbaste, eftersom den byggdes exakt för den här typen av problem.
Det är ett officiellt paket, men inte väldokumenterat i Säkerhet Guide
. Det finns inte på sidan 5 964(!) PL/SQL-paket och -typerreferens , och du måste grant execute on dbms_sqlhash to [user];
för att det ska fungera är det förmodligen därför nästan ingen har hört talas om det.
Till exempel:
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
Risk för en kollision
Det finns några frågor om riskerna för en kollision:Hash Collision - vilka är chanserna? , Kan två olika strängar generera samma MD5-hashkod?
Jag är inte säker på exakt vad som händer med chansen när du börjar summera många rader, men chanserna för en enda kollision är så löjligt låga att du förmodligen är okej.
Jag kan inte matematiken, men jag är säker på att den mest troliga orsaken till en kollision är ett programmeringsfel om du försöker skriva din egen funktion.
Jag har sett och byggt manus precis som detta, och det finns många subtila sätt att skruva ihop det. Till exempel nollvärden och byte av värden mellan rader eller kolumner. Även om du bara använder en kolumn nu, för att förhindra att någon någonsin skriver ett av dessa fula skript bör du använda det medföljande Oracle-paketet när det är möjligt.