[java] 문자열에 대한 좋은 해시 함수

문자열에 대한 좋은 해시 함수를 생각하려고합니다. 그리고 문자열의 처음 다섯 문자에 대한 유니 코드 값을 합산하는 것이 좋습니다. 좋은 생각입니까, 아니면 나쁜 생각입니까?

Java 로이 작업을 수행하고 있지만 큰 차이가 있다고는 생각하지 않습니다.



답변

일반적으로 총액을하지 않을 것입니다 해시, 그렇지 않은 경우 stoppots동일한 해시를해야합니다.

그렇지 않으면 주택과 주택이 동일한 해시를 갖기 때문에 첫 n 문자로 제한하지 않습니다.

일반적으로 해시는 값을 가져와 소수를 곱하여 고유 한 해시를 생성 할 가능성이 높아 지므로 다음과 같은 작업을 수행 할 수 있습니다.

int hash = 7;
for (int i = 0; i < strlen; i++) {
    hash = hash*31 + charAt(i);
}


답변

보안 인 경우 Java 암호화를 사용할 수 있습니다.

import java.security.MessageDigest;

MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
messageDigest.update(stringToEncrypt.getBytes());
String encryptedString = new String(messageDigest.digest());


답변

아마도 String.hashCode ()를 사용해야합니다 합니다.

hashCode를 직접 구현하려면 다음을 수행하십시오.

성능 향상을 위해 해시 코드 계산에서 객체의 상당 부분을 배제하려는 유혹을받지 마십시오-Joshua Bloch, Effective Java

처음 다섯 문자 만 사용하는 것은 좋지 않습니다 . URL과 같은 계층 적 이름을 생각해보십시오. 모두 동일한 해시 코드를 갖습니다 (모두 “http : //”로 시작하기 때문에 해시 맵의 동일한 버킷 아래에 저장되어 성능이 끔찍합니다).

다음은 ” Effective Java ” 의 String hashCode에 대한 전쟁 이야기입니다 .

1.2 이전의 모든 릴리스에서 구현 된 문자열 해시 함수는 첫 문자부터 시작하여 문자열 전체에 고른 간격으로 최대 16자를 검사했습니다. URL과 같은 대규모 계층 이름 모음의 경우이 해시 함수는 끔찍한 동작을 나타냅니다.


답변

Java로 이것을하고 있다면 왜하고 있습니까? 그냥 .hashCode()문자열을 불러


답변

구아바HashFunction ( javadoc )는 적절한 비 암호 강력한 해싱을 제공합니다.


답변

Nick이 제공하는이 기능은 좋지만 new String (byte [] bytes)을 사용하여 String으로 변환하면 실패했습니다. 이 기능을 사용하여이를 수행 할 수 있습니다.

private static final char[] hex = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };

public static String byteArray2Hex(byte[] bytes) {
    StringBuffer sb = new StringBuffer(bytes.length * 2);
    for(final byte b : bytes) {
        sb.append(hex[(b & 0xF0) >> 4]);
        sb.append(hex[b & 0x0F]);
    }
    return sb.toString();
}

public static String getStringFromSHA256(String stringToEncrypt) throws NoSuchAlgorithmException {
    MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
    messageDigest.update(stringToEncrypt.getBytes());
    return byteArray2Hex(messageDigest.digest());
}

누군가를 도울 수 있습니다.


답변

// djb2 hash function
unsigned long hash(unsigned char *str)
{
    unsigned long hash = 5381;
    int c;

    while (c = *str++)
        hash = ((hash << 5) + hash) + c; /* hash * 33 + c */

    return hash;
}


djb2 ​​해시 함수 뒤에 소스 로직-SO