본문 바로가기

빅데이터/Elasticsearch

RestHighLevelClient로 구현한 idempotence 데이터 적재

SHA-256이란? http://wiki.hash.kr/index.php/SHA256

 

SHA256 - 해시넷

SHA-256은 SHA(Secure Hash Algorithm) 알고리즘의 한 종류로서 256비트로 구성되며 64자리 문자열을 반환한다. SHA-256은 미국의 국립표준기술연구소(NIST; National Institute of Standards and Technology)에 의해 공표된

wiki.hash.kr

SHA-256 해시 함수는 어떤 길이의 값을 입력하더라도 256비트의 고정된 결과값을 출력한다. 일반적으로 입력값이 조금만 변동하여도 출력값이 완전히 달라지기 때문에 출력값을 토대로 입력값을 유추하는 것은 거의 불가능하다. 아주 작은 확률로 입력값이 다름에도 불구하고 출력값이 같은 경우가 발생하는데 이것을 충돌이라고 한다. 이러한 충돌의 발생 확률이 낮을수록 좋은 함수라고 평가된다.

그렇다면 ES의 Document의 id를 적재하고자 하는 데이터의 HASH로 사용하면 멱등성 적재가 되지 않을까?

RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("localhost", 9200)));
BulkRequest request = new BulkRequest();

String data = "{\"data\":{\"type\":\"company\",\"name\":\"es\",\"time\":\"2022-01-29T01:59:00.275Z\"}}";
String index = "test-log";
request.add(new IndexRequest(index)
        .source(data, XContentType.JSON)
        .id(encrypt(data)));

client.bulk(request, RequestOptions.DEFAULT);
client.close();

encrypt 메서드

public static String encrypt(String text) throws NoSuchAlgorithmException {
    MessageDigest md = MessageDigest.getInstance("SHA-256");
    md.update(text.getBytes());
    return bytesToHex(md.digest());
}
private static String bytesToHex(byte[] bytes) {
    StringBuilder builder = new StringBuilder();
    for (byte b : bytes) {
        builder.append(String.format("%02x", b));
    }
    return builder.toString();
}

 

 

 

 

 

반응형