如何在Objective-C中获得与Java String.hashCode()相同的结果?

如何在Objective-C中获得与Java String.hashCode()相同的结果?,java,objective-c,hash,hashcode,Java,Objective C,Hash,Hashcode,我一直在阅读关于上String.hashCode()的文档 试图从相同的字符串中获得相同的结果,但我没有得到任何令人满意的结果。 在Objective-C中[NSString hash]给出了完全不同的结果 有人已经这样做了吗 谢谢我制作了一个高效的代码片段,它使用wiki页面上的数学算法模拟了Java string.hashCode()结果: +(NSUInteger)hashCodeJavaLike:(NSString*)字符串{ int h=0; int len=string.lengt

我一直在阅读关于上String.hashCode()的文档 试图从相同的字符串中获得相同的结果,但我没有得到任何令人满意的结果。 在Objective-C中[NSString hash]给出了完全不同的结果

有人已经这样做了吗


谢谢

我制作了一个高效的代码片段,它使用wiki页面上的数学算法模拟了Java string.hashCode()结果:

+(NSUInteger)hashCodeJavaLike:(NSString*)字符串{
int h=0;
int len=string.length;
对于(int i=0;i
}

希望它能帮助别人!
请记住,正如Chris所评论的,如果重写Java string.hashCode()算法,可能会出现问题

阿尔弗雷德提供的答案不正确。首先,hashCode可以返回负数,因此返回类型应该是有符号整数,而不是无符号整数。其次,Charascivalue++已关闭。在原始Java代码中,数组索引是递增的,而不是unichar。以下是NSString上的一个类别的测试/工作版本:

- (int)javaHashCode
{
    int h = 0;

    for (int i = 0; i < (int)self.length; i++) {
        h = (31 * h) + [self characterAtIndex:i];
    }

    return h;
}
-(int)javaHashCode
{
int h=0;
对于(int i=0;i<(int)self.length;i++){
h=(31*h)+[自我特征指数:i];
}
返回h;
}

编辑:我最初使用NSInteger,但遇到了问题。我相信这是因为机器是64位的。将NSInteger切换到int解决了我的问题。

更新了swift 4的代码

func javaHashCode(name:String)-> Int{ 
   var nsname = name as! NSString; var h:Int = 0  
   for (index,value) in name.enumerated(){ 
       h = 31*h + Int(nsname.character(at:index)) 
   } 
     return h 
} 

提供迄今为止您所拥有的代码。您是否考虑到本机字节顺序在不同平台上可能有所不同?到目前为止,这只是毫无意义的代码,顺便说一句,我一直在考虑不同平台之间的不一致性。如果是这样,我宁愿有一个Java服务服务器端来计算散列,而不是客户端来计算散列。卫生署:(平台之间的字节顺序不匹配将产生影响。此外,hashcode的Java实现虽然暂时没有改变,但在Java发行版和供应商之间可以改变。如果您可以选择要求服务器提供hashcode,那么这将是一种更简单、更不脆弱的方法。尽管它会添加一个extra到服务器的往返。如果可能,使用字符串(如果它来自服务器)传输哈希代码以避免往返。如果您继续编写自己的哈希函数,请确保两边的字节相等,并记住Java实现使用的是32位整数而不是字符。字符是16位unsi在Java中使用gned,而INT是32位有符号的。这也可能会使您的代码出错。非常感谢,这非常有效!不知道最终的负值。
func javaHashCode(name:String)-> Int{ 
   var nsname = name as! NSString; var h:Int = 0  
   for (index,value) in name.enumerated(){ 
       h = 31*h + Int(nsname.character(at:index)) 
   } 
     return h 
}