我有从另一个整数创建一个16位数字的情况。它应该像信用卡号码。那么我们的情况是,如果用户ID是1或2,则应该将其散列为16位数字符串(数字)。所以16位数应该是唯一的1 我尝试使用.NET内置函数,如生成哈希等。
这对我的完美解决方案没有帮助
答案 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类实现,以便知道序列是稳定的。