我要求在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版本相关的?
谢谢,