2017-08-21 49 views
-1

我想创建一个函数,它将使我产生总是基于上述两个入口参数唯一值:生成基于DateTime和字符串参数的唯一的哈希

public string ReturnUniqueValue(DateTime date, string ID) 
{ 
// Logic here 
} 

日期参数是在以下格式:

2017-08-14 11:55:32.00 

虽然ID是以下格式:

112452573848 

我想生成一个独特的散列,它的长度是40个字符,它从不重复。

这是可以用datetime参数+唯一id字符串吗?

我觉得日期时间是不一样的(这几乎是不可能的),因此这应该能够始终产生独特的价值?

+2

您可能会从组合这些2中获得重复项(除非ID始终是唯一的)。如果你想要一个有点独特的字符串,看看'Guid.NewGuid()' – Shyju

+0

@Shyju是的ID总是唯一的,什么是散列这个最好的方法? :) – User987

+1

@adiga这只是结合两个字符串? :D – User987

回答

1

可以

  • 将所有的参数(取)到流
  • 使用您喜欢的算法(如SHA265)
  • 计算散列,并返回其前20个值(= 40个字符)作为最终结果

在代码:

public string ReturnUniqueValue(DateTime date, string ID) 
{ 
    var result = default(byte[]); 

    using (var stream = new MemoryStream()) 
    { 
     using (var writer = new BinaryWriter(stream, Encoding.UTF8, true)) 
     { 
      writer.Write(date.Ticks); 
      writer.Write(ID); 
     } 

     stream.Position = 0; 

     using (var hash = SHA256.Create()) 
     { 
      result = hash.ComputeHash(stream); 
     } 
    } 

    var text = new string[20]; 

    for (var i = 0; i < text.Length; i++) 
    { 
     text[i] = result[i].ToString("x2"); 
    } 

    return string.Concat(text); 
} 

注意:如果您只想为多个参数使用单个唯一值,则简单的连接应该已经可以完成。由于您明确要求提供40个字符的“散列”,因此这种更复杂的解决方案可能更适合某种方式。注意:将其扩展为更多相同类型的参数(例如,两个字符串)应包括流内的参数位置以避免冲突((a,b)!=(b,a))。