2013-09-26 1 views
0

T-SQL에서 자바와 비슷한 스칼라 함수를 만들고 싶습니다.T-SQL에서 문자열에 대한 GetHashCode 구현

명령형 언어의 표준 구현은 다음과 같습니다

int hash = 0; 
for (int i = 0; i < length; i++) 
{ 
    hash = 31*hash + value[i]; 
} 
return hash; 

내가 이것을 구현하기 위해 정말 TSQL에서 좋은 아니에요, 내 POV에서 TSQL에 필수적 스타일 코드를 작성하는 것은해야 뭔가 피하십시오. CTE를 사용하여이 작업을 수행 할 수 있습니까? Please =)

또한 항상 결과가 integrer max를 초과하면 정수 min이 아닌 0 이상으로 흐르게 할 수 있습니까? 가능한 인수의 수 (내 솔루션의 특수 클래스 수)가 실제로 크지 않다고 가정 해 봅시다. 1000을 초과해서는 안된다고 가정 해 봅시다. 그래서 여기에서도 uint와 충돌을 피할 수 있습니다.


PS : 누군가가 내가 설명 할 수있는 것보다 나는이 필요합니까, 아마 당신은 더 나은 솔루션을 제안 할 수있는 interesed의합니다. integer 식별 열과 varchar'TypeFullName' 인 테이블을 가지고 있습니다. 우리 C# 솔루션의 클래스의 전체 이름입니다.

그리고 수동으로 ID를 TypeFullName (예, SET IDENTITY INSERT 옵션 사용)의 기능 의존으로 설정하는 스크립트를 작성해야합니다. 타입 이름을 알고 있다면 ID를 계산할 수 있습니다. 나는 그것이 나쁜 디자인을 가진 시스템처럼 들린다는 것을 알고 있습니다. 아마도 그렇습니다.하지만 지금은 이것을해야합니다.)

Thank you!

답변

0

은 내가 internet의 해결책을 발견하고 약간 긍정적 출력을 제한하는이 업데이트되었습니다 : select top from sys.all_objects 정말 해키이지만, (((적어도 작동

begin 
declare @h bigint 
set @h = 0 
select @h = (@h*31 + ascii(substring(@str,X.pos,1)))%4294967296 
    from (select top(len(@str)) 
      row_number() over (order by getdate()) as pos 
      from sys.all_objects) as X 
if @h >= 2147483647 set @h = @h - 2147483647 
return convert(int, @h) 
end; 

있다.

+0

그 row_number()는 TALLY 테이블입니다. 자세한 내용은 Jeff Moden을 참조하십시오. 기본적으로 교차하는 숫자 표입니다. 따라서 각 캐릭터를보고 변환을 적용합니다. –

+0

예, 그것이 작동하는 방법을 알고 있습니다. 그러면 값 1..n이 나열되므로 iterator로 작동합니다. 내가 말한 것은 해킹처럼 보입니다) –

+0

유일한 대안은 [msdb]. [dbo]. [Tally] 테이블을 만들고 1 M 행 또는 사용할 수있는 최대 반복기로로드하는 것입니다. 코드를 '(msdb]. [dbo]. [Tally]에서 TOP (LEN (@str))을 X'로 변경하십시오. 탈리 테이블은 WHILE 루프보다 빠릅니다. 그러나 sys.all_objects를 참조하기 때문에 재미있어 보입니다. (HACK) –

1

CheckSum 대 Hashbytes에 대한 기사를 읽으십시오. (http://craftydba.com/?p=3005)

값이 주어진 해시 키를 생성하는 두 가지 SQL Server 기능입니다. 하나는 다른 것보다 더 독특합니다.

여전히 궁금한 사항이 있으면 질문하십시오.

감사

www.craftydba.com

PS : 정수 (int) 또는 큰 INT로 캐스팅 할 때 정밀도를 잃어 가고있다

. 그냥 GUID (16 바이트 16 진수)로 저장하십시오.

enter image description here

+0

안녕하세요! MD5 사용을 고려했지만 출력을 양의 정수로 제한해야합니다. =) descibed 해시 코드 알고리즘을 사용하는 것이 더 쉽습니다. 'hash = hash % (2^32) at at' 각 반복 및 t 암탉'if (해시> 2147483647) {해시 - = 2147483647; }'. (내가 그런 것 같아요 ...) –

+0

그리고 MD5 해시로 나는 아무것도 할 수 없습니다.'convert (int, HashBytes ('MD5', 'test1'))'와 함께 inst에 대해 어떻게해야합니까? 그것은 -1574543990을 제공합니다. –

+0

첫 번째 주석 추가 :이 경우 SQL Server에서 long (bigint)으로 시작한 다음 반환하기 전에 int로 캐스트합니다. –