-
Notifications
You must be signed in to change notification settings - Fork 0
/
fn_LongHash.sql
60 lines (49 loc) · 1.56 KB
/
fn_LongHash.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
use [master] ;
go
set quoted_identifier, ansi_nulls on ;
if exists (select 1 from information_schema.routines where [routine_schema] = 'dbo' and [routine_name] = 'fn_LongHash')
drop function dbo.[fn_LongHash] ;
go
create function dbo.[fn_LongHash] (
@data varbinary(max)
)
returns varbinary(max)
with returns null on null input
as
begin
-----------------------------------------------------------------------------------------------------------------------
-- Procedure: fn_LongHash
-- Author: Phillip Beazley (phillip@beazley.org)
-- Date: 06/08/2012
--
-- Purpose: Generates an MD5 digest/hash against each 8K hunk of the input, concatenates those and then generates
-- another digest/hash against that string. No, it's not ideal.
--
-- Notes: n/a
--
-- Depends: n/a
--
-- REVISION HISTORY ---------------------------------------------------------------------------------------------------
-- 06/08/2012 lordbeazley Initial creation.
-----------------------------------------------------------------------------------------------------------------------
declare
@res varbinary(max),
@position int,
@len int ;
set @res = 0x ;
set @position = 1 ;
set @len = datalength(@data) ;
while (@position < @len)
begin
set @res = @res + hashbytes('MD5', substring(@data, @position, 8000)) ;
set @position = @position + 8000 ;
end
set @res = hashbytes('MD5', Left(@res, 8000)) ;
return @res ;
end
go
return ;
-- example(s)
declare @theHash varbinary(max) ;
select @theHash = dbo.[fn_LongHash](Convert(varbinary(max), Replicate(Convert(varchar(max), 'a'), 9999))) ;
print @theHash ;