.net 多站点数据库方式session共享疑问

本人是菜鸟需要做多站点共享 我在g.cn里面找了好多关于多站点共享的 其中有个关于存储seesion存储过程小弟很是疑问
alter PROCEDURE [dbo].[AspSessionprco]
@appName char(280),
@appId int OUTPUT
AS
SET @appName = LOWER(@appName)
SET @appId = NULL

 SELECT @appId = AppId 
FROM ASPStateTempApplications 
WHERE AppName = @appName 

IF @appId IS NULL BEGIN 
    BEGIN TRAN        

    SELECT @appId = AppId 
    FROM dbo.ASPStateTempApplications WITH (TABLOCKX) 
    WHERE AppName = @appName 

    IF @appId IS NULL 
    BEGIN 
        EXEC GetHashCode @appName, @appId OUTPUT 

        INSERT dbo.ASPStateTempApplications([appId],[appName]) 
        VALUES 
        (@appId, @appName) 

        IF @@ERROR = 2627 
        BEGIN 
            DECLARE @dupApp char(280) 

            SELECT @dupApp = RTRIM(AppName) 
            FROM  dbo.ASPStateTempApplications 
            WHERE AppId = @appId 

            RAISERROR('SQL session state fatal error: hash-code collision between applications ''%s'' and ''%s''. Please rename the 1st application to resolve the problem.', 
                        18, 1, @appName, @dupApp) 
        END 
    END 

    COMMIT 
END 

RETURN 0 

有2个问题
EXEC GetHashCode @appName, @appId OUTPUT
这个里面的 GetHashCode 存储过程是系统自带的吗?如果是为什么我的sqlserver2005里面美玉哦,如果不是请大虾告诉我这个该怎么写,小弟万分感谢!!!。

[code="sql"]CREATE PROCEDURE GetHashCode
@input tAppName,
@hash INT OUTPUT
AS
/*
This sproc is based on this C# hash function:

int GetHashCode(string s)
{
int hash = 5381;
int len = s.Length;

for (int i = 0; i < len; i++) {
int c = Convert.ToInt32(s[i]);
hash = ((hash << 5) + hash) ^ c;
}

return hash;
}

However, SQL 7 doesn't provide a 32-bit integer
type that allows rollover of bits, we have to
divide our 32bit integer into the upper and lower
16 bits to do our calculation.
*/

DECLARE @hi_16bit INT
DECLARE @lo_16bit INT
DECLARE @hi_t INT
DECLARE @lo_t INT
DECLARE @len INT
DECLARE @i INT
DECLARE @c INT
DECLARE @carry INT

SET @hi_16bit = 0
SET @lo_16bit = 5381

SET @len = DATALENGTH(@input)
SET @i = 1

WHILE (@i <= @len)
BEGIN
SET @c = ASCII(SUBSTRING(@input, @i, 1))

/* Formula:
hash = ((hash << 5) + hash) ^ c */

/* hash << 5 /
SET @hi_t = @hi_16bit * 32 /
high 16bits << 5 /
SET @hi_t = @hi_t & 0xFFFF /
zero out overflow */

SET @lo_t = @lo_16bit * 32 /* low 16bits << 5 */

SET @carry = @lo_16bit & 0x1F0000 /* move low 16bits carryover to hi 16bits /
SET @carry = @carry / 0x10000 /
>> 16 /
SET @hi_t = @hi_t + @carry
SET @hi_t = @hi_t & 0xFFFF /
zero out overflow */

/* + hash /
SET @lo_16bit = @lo_16bit + @lo_t
SET @hi_16bit = @hi_16bit + @hi_t + (@lo_16bit / 0x10000)
/
delay clearing the overflow */

/* ^c */
SET @lo_16bit = @lo_16bit ^ @c

/* Now clear the overflow bits */

SET @hi_16bit = @hi_16bit & 0xFFFF
SET @lo_16bit = @lo_16bit & 0xFFFF

SET @i = @i + 1
END

/* Do a sign extension of the hi-16bit if needed */
IF (@hi_16bit & 0x8000 <> 0)
SET @hi_16bit = 0xFFFF0000 | @hi_16bit

/* Merge hi and lo 16bit back together /
SET @hi_16bit = @hi_16bit * 0x10000 /
<< 16 */
SET @hash = @hi_16bit | @lo_16bit

RETURN 0
GO [/code]