Merge branch '1.4.x' into 1.5.x
This commit is contained in:
commit
9abafb839b
|
@ -23,6 +23,7 @@ import java.nio.charset.Charset;
|
||||||
* reasons to save constructing Strings for ZIP data.
|
* reasons to save constructing Strings for ZIP data.
|
||||||
*
|
*
|
||||||
* @author Phillip Webb
|
* @author Phillip Webb
|
||||||
|
* @author Andy Wilkinson
|
||||||
*/
|
*/
|
||||||
final class AsciiBytes {
|
final class AsciiBytes {
|
||||||
|
|
||||||
|
@ -156,21 +157,35 @@ final class AsciiBytes {
|
||||||
int hash = this.hash;
|
int hash = this.hash;
|
||||||
if (hash == 0 && this.bytes.length > 0) {
|
if (hash == 0 && this.bytes.length > 0) {
|
||||||
for (int i = this.offset; i < this.offset + this.length; i++) {
|
for (int i = this.offset; i < this.offset + this.length; i++) {
|
||||||
int b = this.bytes[i] & 0xff;
|
int b = this.bytes[i];
|
||||||
if (b > 0x7F) {
|
if (b < 0) {
|
||||||
// Decode multi-byte UTF
|
b = b & 0x7F;
|
||||||
for (int size = 0; size < 3; size++) {
|
int limit;
|
||||||
if ((b & (0x40 >> size)) == 0) {
|
int excess = 0x80;
|
||||||
b = b & (0x1F >> size);
|
if (b < 96) {
|
||||||
for (int j = 0; j < size; j++) {
|
limit = 1;
|
||||||
b <<= 6;
|
excess += 0x40 << 6;
|
||||||
b |= this.bytes[++i] & 0x3F;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
else if (b < 112) {
|
||||||
|
limit = 2;
|
||||||
|
excess += (0x60 << 12) + (0x80 << 6);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
limit = 3;
|
||||||
|
excess += (0x70 << 18) + (0x80 << 12) + (0x80 << 6);
|
||||||
|
}
|
||||||
|
for (int j = 0; j < limit; j++) {
|
||||||
|
b = (b << 6) + (this.bytes[++i] & 0xFF);
|
||||||
|
}
|
||||||
|
b -= excess;
|
||||||
|
}
|
||||||
|
if (b <= 0xFFFF) {
|
||||||
|
hash = 31 * hash + b;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
hash = 31 * hash + ((b >> 0xA) + 0xD7C0);
|
||||||
|
hash = 31 * hash + ((b & 0x3FF) + 0xDC00);
|
||||||
}
|
}
|
||||||
hash = 31 * hash + b;
|
|
||||||
}
|
}
|
||||||
this.hash = hash;
|
this.hash = hash;
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,6 +26,7 @@ import static org.assertj.core.api.Assertions.assertThat;
|
||||||
* Tests for {@link AsciiBytes}.
|
* Tests for {@link AsciiBytes}.
|
||||||
*
|
*
|
||||||
* @author Phillip Webb
|
* @author Phillip Webb
|
||||||
|
* @author Andy Wilkinson
|
||||||
*/
|
*/
|
||||||
public class AsciiBytesTests {
|
public class AsciiBytesTests {
|
||||||
|
|
||||||
|
@ -140,16 +141,26 @@ public class AsciiBytesTests {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void hashCodeSameAsString() throws Exception {
|
public void hashCodeSameAsString() throws Exception {
|
||||||
String s = "abcABC123xyz!";
|
hashCodeSameAsString("abcABC123xyz!");
|
||||||
AsciiBytes a = new AsciiBytes(s);
|
|
||||||
assertThat(s.hashCode()).isEqualTo(a.hashCode());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void hashCodeSameAsStringWithSpecial() throws Exception {
|
public void hashCodeSameAsStringWithSpecial() throws Exception {
|
||||||
String s = "special/\u00EB.dat";
|
hashCodeSameAsString("special/\u00EB.dat");
|
||||||
AsciiBytes a = new AsciiBytes(s);
|
}
|
||||||
assertThat(s.hashCode()).isEqualTo(a.hashCode());
|
|
||||||
|
@Test
|
||||||
|
public void hashCodeSameAsStringWithCyrillicCharacters() throws Exception {
|
||||||
|
hashCodeSameAsString("\u0432\u0435\u0441\u043D\u0430");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void hashCodeSameAsStringWithEmoji() throws Exception {
|
||||||
|
hashCodeSameAsString("\ud83d\udca9");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void hashCodeSameAsString(String input) {
|
||||||
|
assertThat(new AsciiBytes(input).hashCode()).isEqualTo(input.hashCode());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue