Java字符串哈希代码是否独立于语言环境?

Java字符串哈希代码是否独立于语言环境?,java,locale,hashcode,Java,Locale,Hashcode,Java完全独立于Java吗?换句话说,如果有人摆弄默认的语言环境,我们是否100%确定这不会影响哈希代码 我们知道这样的摆弄会影响toUpperCase()和toLowerCase() 给定字符串对象的哈希代码不依赖于区域设置。从您链接的javadoc中可以明显看出这一点 但是,任何在字符串中生成不同字符的转换都将导致不同(不相等)的字符串和不同的哈希代码。例如,使用不同的默认字符编码将一组字节转换为字符串可能会产生不同的字符 总之,更改区域设置不会直接影响字符串哈希代码,但可能会导致应用程

Java完全独立于Java吗?换句话说,如果有人摆弄默认的
语言环境
,我们是否100%确定这不会影响哈希代码


我们知道这样的摆弄会影响
toUpperCase()
toLowerCase()

给定
字符串
对象的哈希代码不依赖于区域设置。从您链接的javadoc中可以明显看出这一点

但是,任何在字符串中生成不同字符的转换都将导致不同(不相等)的字符串和不同的哈希代码。例如,使用不同的默认字符编码将一组字节转换为字符串可能会产生不同的字符



总之,更改区域设置不会直接影响字符串哈希代码,但可能会导致应用程序生成不同的字符串值,这将影响它们的哈希代码。

区域设置不会(直接)影响字符串的哈希代码。它完全基于字符串中存储的字符。哈希代码由

char[] val;

for (int i = 0; i < len; i++) {
    h = 31*h + val[off++];
}
char[]val;
对于(int i=0;i

但问题是字符串是如何生成的。例如,如果它是toUpperCase的结果,它取决于语言环境,那么结果字符串显然取决于语言环境,哈希代码也是如此。

好问题,我运行了一个快速测试,似乎更改默认语言环境不会(谢天谢地)更改哈希代码

import java.util.Locale;

public class HashCodeTester {

    public static void main(String[] args) {

        String test = "test";
        int hashCode = test.hashCode();

        System.out.println("hashcode [" + hashCode + "] - locale [" + Locale.getDefault() + "]");

        Locale[] availableLocales = Locale.getAvailableLocales();
        for(int i=0; i<availableLocales.length; i++) {          
            Locale.setDefault(availableLocales[i]);
            System.out.println("hashcode [" + test.hashCode() + "] - locale [" + Locale.getDefault() + "]");
        }

    }
}

String上的equals方法明确指出,只有当字符串表示相同的字符序列时,它们才是相等的(也就是说,这里不进行任何转换)

虽然这不能保证hashcode不使用区域设置信息(通常可能),但Oracle JVM中的实现如下所示:

public int hashCode() {
    int h = hash;
        int len = count;
    if (h == 0 && len > 0) {
        int off = offset;
        char val[] = value;

            for (int i = 0; i < len; i++) {
                h = 31*h + val[off++];
            }
            hash = h;
        }
        return h;
    }
public int hashCode(){
int h=散列;
int len=计数;
如果(h==0&&len>0){
int off=偏移量;
char val[]=值;
对于(int i=0;i

这只使用字符,不使用区域设置信息。

可能重复:@Bryan我看到了这个问题,但它没有回答我提出的问题。我用特殊字符(重音等)尝试了你的代码,哈希代码也不会根据区域设置而改变。+1用于解释,你能举一个例子来说明你在这里说的“使用不同的默认字符编码将一串字节翻译成一个字符串可能会导致不同的字符”@eon-主要问题是,如果你选择了错误的编码,翻译会给你“随机的奇怪字符”或者,它将用表示无法识别字符的字符(例如?')替换不可翻译的字节。如果使用(例如)字符串构造函数转换字节,则未识别输入的实际行为是“未指定的”。
public int hashCode() {
    int h = hash;
        int len = count;
    if (h == 0 && len > 0) {
        int off = offset;
        char val[] = value;

            for (int i = 0; i < len; i++) {
                h = 31*h + val[off++];
            }
            hash = h;
        }
        return h;
    }