2013-01-08 5 views
2

일련의 값이 항상 동일한 ID를 생성하고 고유해야하는 방법을 찾아야합니다.동일한 값에서 고유 ID를 생성하는 방법

이 주된 이유는 많은 조인을해야하기 전에 하나의 비교로 쿼리를 빠르게하는 것입니다. 내 도메인을 알고 슬프게도 값이 닫히지 않습니다 (즉, 무엇이든 관련 될 수 있습니다).

해시로 tryied하지만 정의상 해시 함수가 고유성을 보장하지 않습니다. 방법이 있습니까? 나는 장치의 다른 세트에서 오는 이벤트 상관 관계 시스템하고 있어요

좀 더 상황 :

편집 할 수 있습니다. 상관 관계는 이벤트의 일부를 통해 계산된다

속성 : 그것은 어디에서 온에서

  • 합니다.
  • 어떤 종류의 이벤트입니까?
  • 다른 그룹에서 같은 종류의 이벤트가 다르면 그 값이 다릅니다.

예를 들어, 이와 같은 것을 생각해보십시오. 내 장치가 냉장고라고 상상해보십시오. 그것은 그것의 내부에있는 온도와 음식에 관한 사건을 보냅니다. 그래서, 우리는이 순서로 이벤트를 수신 상상 : 유형 temperature

Event1: {type: temperature, values: [{temperature: -1]} 
Event2: {type: food, values: [{group: vegetable, name: brocollis, quantity: 2, weight: 0.1]} 
Event3: {type: food, values: [{group: vegetable, name: lettuce, quantity: 1, weight: 0.1]} 
Event4: {type: temperature, values: [{temperature: -5]} 

모든 이벤트는 상관 관계가되어야하지만, 유형 food의 상관 관계도 그 namegroup에서 제공됩니다. 즉, 상관 관계 식별자의 수는 다양합니다.

이 상관 관계는 그것은 내가 상관 관계를 식별하는 값을 저장 식별자 배열 내부의이

@Entity 
public class EventCorrelation { 
    @Id @GeneratedValue 
    @Audit 
    private Long id; 

    @ElementCollection 
    @CollectionTable(
     name = "evt_corr_extra_id", 
     joinColumns = @JoinColumn(name = "correlation_id")) 
    @Column(name = "extra_id") 
    @LazyCollection(LazyCollectionOption.TRUE) 
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 
    private Collection<String> identifiers; 
    // getters/setters 
} 

같은 구조에 저장됩니다. 이벤트 상관 관계를 검색하는 쿼리의 속도를 높이고 내 첫 번째 아이디어는 상관 관계 identifiers에서 고유 한 ID를 생성하는 것이 었습니다.

특정 이벤트에서 특정 속성이 상관 식별자임을 알고있는 지식 데이터베이스가 있습니다.

팁이 있습니까?

+2

좋은 대답을 얻으려면 좀 더 많은 컨텍스트를 제공해야한다고 생각합니다. 어떤 종류의 입력 데이터가 있고 어떤 종류의 출력이 필요합니까? 당신이 질의와 조인에 대해 언급했기 때문에 이것은 실제로 Java가 아닌 SQL 질문입니까? – Christoffer

+0

또한 정의에 따라 해시가 고유성을 보장하지 않는다는 사실이 옳지 않습니다. 충돌이없는 해시는 '완벽한 해시'라고 불리며, 전체 입력 집합을 알고있는 경우 매우 유용합니다. – Christoffer

+0

확인. 더 많은 맥락을 줄 것이다. 그리고 저는 알지만 완벽한 해시를 만들 수 있습니다. 하지만 슬프게도 나는 모든 입력 집합을 모르지만 그것의 일부입니다. –

답변

3

가능한 한 가지 해결책은 값을 문자열로 변환하고 일종의 예약 된 구분 기호를 사용하여 연결하고 순서를 유지하는 것입니다. String은 고유 한 ID가됩니다. 예를 들어

, 값 1, "밥"7383.234 "{asdf을가}"을 2013-01-08 다음과 같은 고유 ID를 것은 :

"1|Bob|7383.234|{asdf}|2013-01-08" 

memoization 기술의 일종이다 .

+0

이것은 검색 키로 사후에 사용할 수있는 유일한 솔루션입니다. 위에 제시된 제안들 중 어느 것도 사실이 아닙니다. – CPerkins

+0

문제는 값 순서를 보장 할 수 없다는 것입니다./ –

+0

@RalfHoppen 그 뜻은 무엇입니까? 그들은 순서가없는 문자열의 모음 일뿐입니다. 그런 다음 주문하십시오. 무엇이든 그들을 정렬하고, 당신은 반복 주문을해야합니다. – CPerkins

0

유일한 방법은 문자열 사전을 만드는 것입니다. 고유 한 문자열에 대해 고유 한 id이이 사전에 표시됩니다. 그러나이 방법은 성능 저하 및 메모리 사용을 증가시킵니다.

편집 1 : 그런데 가능한 한 가지 생각은 기본 String의 개체 ID를 사용하는 것입니다. Java에서 모든 문자열은 기본적으로 캐시됩니다. 따라서 객체의 메모리 주소와 연결된 원시 해시를 사용해 볼 수 있습니다. System.identityHashCode()을 사용하는 것과 같은 것입니다.

EDIT 2 : 이전의 성명서에서 저는 문자열의 캐시에 대해서는 정확히 맞지 않았습니다. 어떤 방법으로 이제 예를 들어 두 개의 음식 이벤트의 System.identityHashCode()

+0

System.identityHashCode()가 String.hashCode()보다 더 나은 방법을 자세히 설명해 주시겠습니까? 그것은 System.identityHashCode() 어떤 값이 될 수 있으며 프로그램의 다른 실행간에 변경할 수있는 것 같습니다. String.hashCode()는 실제로 잘 정의되어 있으며 안정적이어야합니다. –

+0

@ArnostValicek 각 프로그램 실행 후 모든 문자열이 메모리에로드되는 경우 이는 중요하지 않습니다. 이러한 종류의 DB-in-memory 결정입니다. – Andremoniy

1

에 캐시 값 객체를 사용하여 다음 (HashMap에 사용) 수동으로 같은 캐시를 작성하고 수 :

Event11: {type: food, values: [{group: vegetable, name: brocollis, quantity: 2, weight: 0.1]} 
Event12: {type: food, values: [{group: vegetable, name: brocollis, quantity: 3, weight: 0.27]} 

은이 두 이벤트 모두 brocollis위한 일 수 있었다, 수량과 무게는 ID의 일부가 아닙니다. 나는이 가정 는 지정된 이벤트에서 특정 속성이 상관 ID는 것을 알고 당신의 지식 데이터베이스 응답한다 당신은 ID의 속성 설정 한 후에

, {유형, 그룹, 이름}을 가정 해 봅시다 그것을 정렬하고 그들로부터 ID를 만들 수 있습니다. 예 : "{group : vegetable, name : broccolis, type : food}"= ID는 문자열이고, 속성은 속성 이름순으로 정렬됩니다.

Btw는 도메인이 폐쇄되지 않았지만 지식 데이터베이스가 있다는 사실은이 제한이 유형 만 알려진 것으로 허용되어야 함을 의미합니다. ID가 조금 더 짧아지기를 원한다면 적어도 유형에 대해 유형을 나타내는 숫자 값을 찾을 수 있어야합니다.

+0

귀하는 귀하의 가정에서 정확합니다.'양'과 '무게'는 상관 계산에 포함되지 않습니다. –

관련 문제