public static int Hash(string str) { return(StringHasher.HashSubstring(str, 0, str.Length)); }
public static Key DecodeToken(string text, Token token) { if (token.Type != TokenType.EncodedString) { return(new Key(text.Substring(token.Start, token.Length), token.Hash)); } int cur = token.Start; StringBuilder value = new StringBuilder(token.Length); StringHasher hasher = StringHasher.Create(); for (int end = cur + token.Length; cur != -1 && cur < end;) { char ch = text[cur]; if (ch == '\\') { ch = (cur + 1 < end) ? text[cur + 1] : '\0'; switch (ch) { case '\"': case '\\': case '/': hasher.AddChar(ch); value.Append(ch); cur += 2; break; case 'b': hasher.AddChar('\b'); value.Append('\b'); cur += 2; break; case 'f': hasher.AddChar('\f'); value.Append('\f'); cur += 2; break; case 'n': hasher.AddChar('\n'); value.Append('\n'); cur += 2; break; case 'r': hasher.AddChar('\r'); value.Append('\r'); cur += 2; break; case 't': hasher.AddChar('\t'); value.Append('\t'); cur += 2; break; case 'u': if (cur + 5 < end) { string buffer = text.Substring(cur + 2, 4); if (uint.TryParse(buffer, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out uint decoded)) { ch = (char)decoded; hasher.AddChar(ch); value.Append(ch); cur += 6; } else { cur = -1; } } else { cur = -1; } break; default: cur = -1; break; } } else { hasher.AddChar(ch); value.Append(ch); cur++; } } if (cur == -1) { throw JsonException.New(Resources.Parser_InvalidStringToken); } return(new Key(value.ToString(), hasher.HashValue)); }