Преобразовать строку (слово) в длинную - PullRequest
0 голосов
/ 19 декабря 2018

Я хочу создать уникальный идентификатор из строки, такой как «Testcase1», «Testcase2» и так далее.Поэтому я хочу преобразовать строку в целое число соответственно long.

Я пробовал это, но я думаю, что число / ID не является ни уникальным, ни этот метод правильным.Я хочу преобразовать все слово в число.

long numberId = 0;
foreach (var character in testString.ToCharArray())
{
    numberId +=  Convert.ToInt16(character);
}

Ответы [ 5 ]

0 голосов
/ 19 декабря 2018

Как насчет этой реализации, использующей сумму байтового массива на основе тестовой строки:

    long uniqueId = "Testcase1".SelectMany(BitConverter.GetBytes).ToArray().Sum(c=> c);
    long uniqueId2 = "Testcase2".SelectMany(BitConverter.GetBytes).ToArray().Sum(c => c);

Testcase1 -> 877

Testcase2 -> 878

0 голосов
/ 19 декабря 2018

Если он должен быть уникальным, тогда long не сработает, потому что есть больше строк, чем может поместиться в long.Если вам действительно нужен уникальный номер, вы можете использовать конструктор System.Numerics.BigInteger, который принимает байтовый массив, например

var id = new BigInteger(Encoding.Unicode.GetBytes("string goes here"));

В зависимости от того, что вы делаете, это можетможет быть бесполезным.

0 голосов
/ 19 декабря 2018

У меня нет доказательств, но я думаю, что следующий метод будет генерировать уникальное значение.

public static void Main()
{
    long numberId = 0;
    var testString = "Testcase3";
    long multiplier = (long)Math.Pow(10,testString.Length);
    foreach (var character in testString.ToCharArray())
    {
        numberId +=  Convert.ToInt16(character)*multiplier;
        multiplier /=10;
    }
    Console.WriteLine(numberId);
}
0 голосов
/ 19 декабря 2018

Не уверен, что это то, что вам нужно:

static void Main(string[] args)
        {          

            var inputText = "Testcase1";
            Console.WriteLine($"{inputText} =>{CalculateTotal(GetHashString(string.Concat(inputText,DateTime.Now.Date.ToString(),  DateTime.Now.TimeOfDay.ToString())).ToArray<char>())}");
            inputText = "Testcase2";
            Console.WriteLine($"{inputText} =>{CalculateTotal(GetHashString(string.Concat(inputText,DateTime.Now.Date.ToString(),  DateTime.Now.TimeOfDay.ToString())).ToArray<char>())}");


        }
        static string GetHashString(string inputText)
        {
            HashAlgorithm hash = new SHA256Managed();
            var bytes = new byte[inputText.Length];
            bytes = Encoding.ASCII.GetBytes(inputText);
            return Encoding.ASCII.GetString( hash.ComputeHash(bytes));
        }

        static long CalculateTotal(char [] items)
        {

            var i = Array.ConvertAll<char, long>(items, Convert.ToInt64);
            return i.Sum();             
        }

вывод:

Testcase1 => 1880

Testcase2 => 1788

0 голосов
/ 19 декабря 2018

Как насчет этого?

var sha = System.Security.Cryptography.SHA512.Create();
var inputBytes = System.Text.Encoding.ASCII.GetBytes("Test case");
var hash = sha.ComputeHash(inputBytes);
var result = BitConverter.ToInt64(hash);
...