Skip to content

Commit 03b3aa3

Browse files
authored
IsValid() method performance improved ~10x. Tests fixed - alternative letters (like I instead of 1) should be allowed. (#11)
1 parent 38a061b commit 03b3aa3

File tree

2 files changed

+8
-17
lines changed

2 files changed

+8
-17
lines changed

src/ByteAether.Ulid.Tests/Ulid.IsValid.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ public class UlidIsValidTests
55
[Theory]
66
[InlineData("01AN4Z07BY79KA1307SR9X4MV3")]
77
[InlineData("00000000000000000000000000")]
8+
[InlineData("oooooooooooooooooooooooooo")]
89
[InlineData("7ZZZZZZZZZZZZZZZZZZZZZZZZZ")]
910
public void IsValid_GoodString(string goodString)
1011
{
@@ -21,7 +22,7 @@ public void IsValid_GoodString(string goodString)
2122
[InlineData("")]
2223
[InlineData("01AN4Z07BY79KA1307SR9X4MV")]
2324
[InlineData("01AN4Z07BY79KA1307SR9X4MV3A")]
24-
[InlineData("01AN4Z07BY79KA1307SR9X4MVI")]
25+
[InlineData("01AN4Z07BY79KA1307SR9X4MVU")]
2526
[InlineData("01AN4Z07BY79KA1307SR9X4MV@")]
2627
public void IsValid_BadString(string badString)
2728
{
@@ -35,6 +36,7 @@ public void IsValid_BadString(string badString)
3536
[Theory]
3637
[InlineData("01AN4Z07BY79KA1307SR9X4MV3")]
3738
[InlineData("00000000000000000000000000")]
39+
[InlineData("oooooooooooooooooooooooooo")]
3840
[InlineData("7ZZZZZZZZZZZZZZZZZZZZZZZZZ")]
3941
public void IsValid_GoodStringSpan(string goodString)
4042
{
@@ -51,7 +53,7 @@ public void IsValid_GoodStringSpan(string goodString)
5153
[InlineData("")]
5254
[InlineData("01AN4Z07BY79KA1307SR9X4MV")]
5355
[InlineData("01AN4Z07BY79KA1307SR9X4MV3A")]
54-
[InlineData("01AN4Z07BY79KA1307SR9X4MVI")]
56+
[InlineData("01AN4Z07BY79KA1307SR9X4MVU")]
5557
[InlineData("01AN4Z07BY79KA1307SR9X4MV@")]
5658
public void IsValid_BadStringSpan(string badString)
5759
{

src/ByteAether.Ulid/Ulid.IsValid.cs

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -32,26 +32,15 @@ public static bool IsValid(ReadOnlySpan<char> ulidString)
3232
return false;
3333
}
3434

35-
// First character check
36-
var isValidFirstChar = false;
37-
for (var i = 7; i >= 0; --i)
38-
{
39-
if (ulidString[0] == _base32Chars[i])
40-
{
41-
isValidFirstChar = true;
42-
break;
43-
}
44-
}
45-
46-
if (!isValidFirstChar)
35+
var firstChar = ulidString[0];
36+
if (_inverseBase32[firstChar] > 7)
4737
{
4838
return false;
4939
}
5040

51-
// Rest of the characters check
52-
foreach (var c in ulidString[1..])
41+
for (var i = 1; i < UlidStringLength; i++)
5342
{
54-
if (!_base32Chars.Contains(c))
43+
if (_inverseBase32[ulidString[i]] == 255)
5544
{
5645
return false;
5746
}

0 commit comments

Comments
 (0)