Создать короткое целое число из уникальной строки без .GetHashCode () - PullRequest
0 голосов
/ 06 марта 2020

Я бы хотел сгенерировать короткое целое число, когда ему присваивается уникальная строка. Обратите внимание, что длина строки никогда не будет превышать 3 символов, только буквенные символы могут быть в верхнем или нижнем регистре. Например, AB не должно возвращать то же значение, что и BA. Я попробовал что-то вроде следующего (ниже), только чтобы наткнуться на BA равное AK:

public static class StringExtensions
{
    public static int StringToASCIIValue(this string str)
    {
        if (string.IsNullOrWhiteSpace(str)) 
            throw new ArgumentException("string must not be null or whitespace");

        int result = 0;
        foreach (char singleChar in str)
        {
            result = 10 * result + singleChar - '0';
        }
        return result;
    }
}

Ответы [ 2 ]

1 голос
/ 06 марта 2020

Вот простой способ выполнить sh это. Нет двух результатов будет одинаковым. Мы берем строку, затем для каждого символа в ней добавляем значение ascii к строителю строки. Когда мы закончим, мы можем вывести уникальное целое число для этой комбинации символов.

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

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

Console.WriteLine(stringBuilder.ToString());

Вывод

6566
0 голосов
/ 06 марта 2020

Если вы действительно уверены, что никогда не смотрите более 3 символов алфавита c (A-Z или a-z), вы сможете получить ASCII закодированные байты и преобразование их непосредственно в int.

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;
    }
}

Если это имеет значение, вы можете затем вернуть это int обратно в string, который его сгенерировал.

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);
    }
}
...