【问题标题】:Convert string (word) to long将字符串(单词)转换为长
【发布时间】:2019-05-19 14:59:48
【问题描述】:

我想从“Testcase1”、“Testcase2”等字符串创建一个唯一的 ID。因此,我想将字符串分别转换为整数。

我已经尝试过了,但我认为数字/ID 既不是唯一的,也不是这种方法正确的方法。我想把整个单词转换成一个数字。

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

【问题讨论】:

  • 您能提供一个示例输入/输出吗?目前你总结每个字符的ASCII值long numberId = testString.Sum(x => x);
  • 当你只添加字符值时,“AB”和“BA”都会给出相同的结果
  • 你想把字符转换成ASCII码吗?
  • long numberId = testString.GetHashCode(); 怎么样?
  • 可能的字符串数量远高于 ints 或 longs 的数量。所以它不能是唯一的

标签: c# .net string casting type-conversion


【解决方案1】:

这个怎么样?

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

【讨论】:

    【解决方案2】:

    我没有证据,但我认为以下方法会产生独特的价值。

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

    【讨论】:

      【解决方案3】:

      不确定这是不是你想要的:

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

      输出:

      测试用例1 =>1880

      测试用例2 =>1788

      【讨论】:

        【解决方案4】:

        如果它需要是唯一的,那么 long 将不起作用,因为有更多的字符串无法放入 long 中。如果你真的需要一个唯一的数字,你可以使用System.Numerics.BigInteger的构造函数,它接受一个字节数组,例如

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

        这取决于你在做什么,这可能有用也可能没用。

        【讨论】:

          【解决方案5】:

          如何使用基于测试字符串的字节数组之和来实现:

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

          Testcase1 ->877

          Testcase2 ->878

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-06-15
            • 1970-01-01
            • 2011-09-05
            • 1970-01-01
            • 2021-11-28
            • 2021-02-11
            相关资源
            最近更新 更多