来自iOS和Android上的字符串的长哈希

时间:2015-08-02 10:58:01

标签: java android ios hash

我要求在iOS和Android上对字符串进行长时间哈希处理。在两个平台上必须对相同的字符串具有相同的结果。

我在iOS上使用的代码是:

+ (long long)hashString:(NSString *)stringToHash
{
     if (stringToHash.length == 0)
        return -1;

     //cr: resolve the warnings here
     const unsigned char* str = [stringToHash UTF8String];
     int hash = 5381;
     int c;
     while ((c = *str++)) hash = ((hash << 5) + hash) + c;
     bool isNegative = (hash < 0);
     hash = abs(hash);
     long long lhash = (long)hash;
     long long mask = 1;
     mask <<= 31;
     if (isNegative) lhash |= mask;
     return lhash;
}

对于Android我使用此代码(c代码,转换为Java):

public static long doHash(String value) {  
       if (TextUtils.isEmpty(value)) {
           return -1;
       }

       int hash = 5381;               
       for (int i = 0; i < value.length(); i++) {
           hash = ((hash << 5) + hash) + value.charAt(i);
       }     

       boolean isNegative = (hash < 0);
       hash = Math.abs(hash);

       long lHash = (long) hash;
       long mask = 1;       
       mask <<= 31;       
       if (isNegative) { lHash |= mask; }     

       return lHash;
 }

一般情况下,一切正常但有时在Android中我遇到了问题,我在同一个字符串中得到不同的哈希值。

例如:

            doHash("Saved Tap"); returns – 3598946179
            doHash("Saved Tap"); returns – 3433737033

我从设备的日志中获取这些值...无法在我拥有的设备上重现。

有没有人看到Java代码中可能导致此问题的任何错误?可以是Java版本还是与Android版本相关的?

谢谢,

0 个答案:

没有答案