将一个小整数值哈希到一个大的16位唯一数字

时间:2013-07-17 04:52:01

标签: asp.net vb.net hash

我有从另一个整数创建一个16位数字的情况。它应该像信用卡号码。那么我们的情况是,如果用户ID是1或2,则应该将其散列为16位数字符串(数字)。所以16位数应该是唯一的1 我尝试使用.NET内置函数,如生成哈希等。

这对我的完美解决方案没有帮助

2 个答案:

答案 0 :(得分:1)

不确定您期望的用户数量,但此代码生成16位整数,使用1到100之间的数字没有重复:

Imports System.Security.Cryptography

    Dim sha As New SHA1CryptoServiceProvider()
    Dim IntList As New List(Of ULong)
    For I = 1 To 100000
        'Need a byte array for the ComputeHash method
        Dim data() As Byte = BitConverter.GetBytes(I)
        If BitConverter.IsLittleEndian Then Array.Reverse(data)
        'Store the 160 bit hash in a byte array
        Dim result As Byte() = sha.ComputeHash(data)
        'Bitconverter's result can be too long, so by taking the first 16 digits _
         of the results that are too long, and padding the rest to the right with _
        0's we end up with unique 16 digit integers
        Dim HashInt As ULong = ULong.Parse(BitConverter.ToUInt64(result, 0).ToString.PadRight(16, "0"c).Substring(0, 16))
        'Using a list to hold the hash's is just to confirm that each one is unique. _
        for the your purposes I would suggest a dictionary(of integer, ulong)
        If Not IntList.Contains(HashInt) Then
            IntList.Add(HashInt)
        End If
    Next

更新:修改代码以显示它将产生100000个唯一哈希值。 IntList.Count = 100000。

对于最终小于16位的结果,我用0填充了结尾。这很方便。通过将BitConverter.ToUInt64结果放入一个字符串,您可以在任何地方插入0。

答案 1 :(得分:1)

也许你可以用这个:

string SixteenDigitHash(int value)
{
   var rnd = new Random(value);
   StringBuilder sb = new StringBuilder(16);
   sb.Append(rnd.Next(1,10)); // first digit 1..9
   for (int i=1; i<16; i++)
   {
     sb.Append(rnd.Next(0,10)); // other digits 0..9
   }

   return sb.ToString();
}

它使用Random生成(伪)随机数,但使用值到散列作为种子,因此它总是为给定值生成相同的序列,为不同的值生成不同的序列。

一个问题:对于不同版本的框架,序列不保证是相同的。也许您应该使用自己的Random类实现,以便知道序列是稳定的。