Skip to content

Commit

Permalink
Add Sha1.ToShortString
Browse files Browse the repository at this point in the history
  • Loading branch information
YoshihiroIto committed Jan 8, 2024
1 parent b37a743 commit 39f4848
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 4 deletions.
44 changes: 42 additions & 2 deletions Jewelry.Test/Text/Sha1Tests.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
using Xunit;
using Jewelry.Text;
using System;
using System.Collections.Generic;

namespace Jewelry.Test.Text;

Expand All @@ -14,7 +16,45 @@ public void Parse()

Assert.Equal("a78ca3a164cebb516a6fda68b655b7903a895209", result);
}


[Theory]
[MemberData(nameof(ToShortStringSource))]
public void ToShortString(string expected, int length)

{
var sut = new Sha1("a78ca3a164cebb516a6fda68b655b7903a895209");

var result = sut.ToShortString(length);

Assert.Equal(expected, result);
}

public static IEnumerable<object[]> ToShortStringSource()
{
for (var i = 0; i <= 40; ++i)
yield return ["a78ca3a164cebb516a6fda68b655b7903a895209"[..i], i];
}

[Fact]
public void ToShortString_Under()
{
Assert.Throws<ArgumentOutOfRangeException>(() =>
{
var sut = new Sha1("a78ca3a164cebb516a6fda68b655b7903a895209");
sut.ToShortString(-1);
});
}

[Fact]
public void ToShortString_Over()
{
Assert.Throws<ArgumentOutOfRangeException>(() =>
{
var sut = new Sha1("a78ca3a164cebb516a6fda68b655b7903a895209");
sut.ToShortString(100);
});
}

[Fact]
public void OperatorEquals()
{
Expand All @@ -25,7 +65,7 @@ public void OperatorEquals()

Assert.True(result);
}

[Fact]
public void OperatorNotEquals()
{
Expand Down
4 changes: 2 additions & 2 deletions Jewelry/Jewelry.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<PackageLicenseFile>README.md</PackageLicenseFile>
<Copyright>Copyright (c) 2019-2023 copyright Yoshihiro Ito ([email protected])</Copyright>
<Version>2.0.24</Version>
<Version>2.0.25</Version>
<Authors>Yoshihiro Ito</Authors>
<Company>Jewelry</Company>
<PackageProjectUrl>https://github.com/YoshihiroIto/Jewelry</PackageProjectUrl>
Expand All @@ -13,7 +13,7 @@
<AssemblyVersion>2.0.0.0</AssemblyVersion>
<FileVersion>2.0.0.0</FileVersion>
<Description>.NET support</Description>
<PackageVersion>2.0.24</PackageVersion>
<PackageVersion>2.0.25</PackageVersion>
<LangVersion>latest</LangVersion>
<TargetFrameworks>net7.0;net8.0</TargetFrameworks>
</PropertyGroup>
Expand Down
37 changes: 37 additions & 0 deletions Jewelry/Text/Sha1.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,43 @@ public override string ToString()
}
});
}

public string ToShortString(int length)
{
if (length < 0)
throw new ArgumentOutOfRangeException();

if (length > 40)
throw new ArgumentOutOfRangeException();

if (length == 0)
return "";

return string.Create(length, this, static (span, t) =>
{
var count = 0;

for (var i = 0; i != 32; i++)
{
var c = (t._value0 >> ((31 - i) * 4)) & 0x0F;
span[i] = c < 10 ? (char)('0' + c) : (char)('a' + c - 10);

++count;
if(count == span.Length)
return;
}

for (var i = 0; i != 8; i++)
{
var c = (t._value1 >> ((7 - i) * 4)) & 0x0F;
span[32 + i] = c < 10 ? (char)('0' + c) : (char)('a' + c - 10);

++count;
if(count == span.Length)
return;
}
});
}

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool operator ==(Sha1 left, Sha1 right)
Expand Down

0 comments on commit 39f4848

Please sign in to comment.