C# 从不带.GetHashCode()的唯一字符串生成短整数

C# 从不带.GetHashCode()的唯一字符串生成短整数,c#,string,type-conversion,C#,String,Type Conversion,我想在给定唯一字符串时生成一个短整数。请注意,字符串长度永远不会超过3个字符,只有字母字符可以是大写或小写。例如,AB不应返回与BA相同的值。我尝试了下面这样的方法,结果却发现BA等于AK: 这里有一个简单的方法来实现这一点。没有两个结果是相同的。我们获取字符串,然后为其中的每个字符将ascii值附加到字符串生成器中。完成后,我们可以为该字符组合输出唯一的整数 string first = "AB"; StringBuilder stringBuilder = new StringBuilder

我想在给定唯一字符串时生成一个短整数。请注意,字符串长度永远不会超过3个字符,只有字母字符可以是大写或小写。例如,AB不应返回与BA相同的值。我尝试了下面这样的方法,结果却发现BA等于AK:


这里有一个简单的方法来实现这一点。没有两个结果是相同的。我们获取字符串,然后为其中的每个字符将ascii值附加到字符串生成器中。完成后,我们可以为该字符组合输出唯一的整数

string first = "AB";
StringBuilder stringBuilder = new StringBuilder();

foreach(char c in first)
{
     stringBuilder.Append((int)c);
}

Console.WriteLine(stringBuilder.ToString());
输出

6566
如果你真的确定你从来没有看过超过3个字母A-Z或A-Z字符,你应该能够得到ASCII编码的字节,并将它们直接转换成整数


为什么要避免GetHashCode?我真的看不到限制从中得到的整数的好处。一个整数占用一个整数的空间,不管它是来自GethashCode还是使用较小的数字进行计算。最简单的方法是将每个字符转换为其ascii值,然后将两个字符连接成一个整数。然后AB=6566、BA=6665、AK=6575等。没有两种组合是相同的same@TheBatman的方法很好,但要知道,如果您决定需要能够转换回,您需要一些额外的逻辑,例如11165应该转换回111和65还是11和165?显然,在您的特定情况下,只有第一个是有效的。@BrootsWaymb我需要事先知道这些数字,以便进行枚举。您只需使用string.Concatfirst.Selectc=>intc.就可以得到相同的输出;char是一个非常宽泛的概念,下面两个将产生相同的散列:“int i1=+char1234+char567.stringtoascivalue;int i2=+char123+char4567.stringtoasivalue;'@OguzOzgul字符是一个宽泛的概念,但字母字符(小写和大写)则不是。这些都是OP.@the蝙蝠侠提供的限制条件,关于ÜĞİŞÖ和ğışçç,它们是非ASCII土耳其大写和小写字符。你看对了吗?如果是,这是由于浏览器支持UTF-8。如果你真的想说字母字符,小写和大写不是一个宽泛的概念,我邀请你阅读字符集,unicode,UTF-8,UTF-16等等。
6566
public static class StringExtensions
{
    public static int ToInt32(this string str)
    {
        // Checks for null omitted.
        var ascii = System.Text.Encoding.ASCII.GetBytes(str);
        int result = 0;
        for (int i = 0; i < ascii.Length; i++)
        {
            result = result | (ascii[i] << (i * 8));
        }
        return result;
    }
}
public static class StringExtensions
{   
    public static string AsciiIntBackToString(this int value)
    {
        var bytes = BitConverter
            .GetBytes(value)
            .Where(b => b > 0)
            .ToArray();
        return System.Text.Encoding.ASCII.GetString(bytes);
    }
}