我删除了可逆性的要求。
这是我的解决方案,请评论:
string classTIC = "3254002092";
MD5 md5Hasher = MD5.Create();
byte[] classHash = md5Hasher.ComputeHash(Encoding.Default.GetBytes(classTIC));
StringBuilder sBuilder = new StringBuilder();
foreach (byte b in classHash)
{
sBuilder.Append(b.ToString());
}
string newClass = (double.Parse(sBuilder.ToString())%9999 + 1).ToString();
答案 0 :(得分:2)
您可以执行类似
的操作str.GetHashCode()%9999 + 1;
由于您有超过9,999个字符串
当然,如果你没有超过9999个不同的10个字符类,我的答案是错误的。
如果你没有超过9999个类,你需要有一个从字符串id到其4个char表示的映射 - 例如 - 将stings保存在列表中,每个字符串键将是列表中的索引< / p>
答案 1 :(得分:2)
如果你想要颠倒这个过程,并且除了最多9999之外不了解id之外,我认为你需要使用翻译词典将每个id映射到它的简短版本。
即使没有必要扭转这个过程,我也不认为如果没有这样的字典,就有办法确定唯一的id。
这个简短的版本可以简单地用每个新id增加一个。
答案 2 :(得分:1)
答案 3 :(得分:1)
你不想要哈希。设计哈希允许碰撞。对于您使用的不会发生冲突的字符串类型,没有可能的散列函数。
您需要构建持久映射表以将字符串转换为数字。逻辑上类似于Dictionary<string, int>
。您要添加的第一个字符串的编号为0.当您需要映射时,请查找该字符串并返回其关联编号。如果它不存在则添加字符串并简单地为其分配一个等于计数的数字。
使这个映射表持久化是您需要考虑的问题。当然,简单地用dbase完成。
答案 4 :(得分:0)
将数字转换为base35/bas e36
例如:3800290030十进制= 22CGHK5 base-35 //长度:7
或者可以转换为Base60 [忽略Capital O和小o不与0混淆]
例如:3800290030十进制= 4tDw7A base-60 //长度:6
答案 5 :(得分:0)
我认为您可能需要创建和存储查找表才能支持您的要求。在这种情况下,您甚至不需要哈希,只需增加最后使用的4位数查找代码。
答案 6 :(得分:0)
将int转换为二进制,然后对其进行base64编码。它不会是数字,但它将是一个可逆的哈希。
修改强>
据我的感觉告诉我你要求不可能的事。
你不能采取完全随机的数据,并以某种方式减少编码它所需的数据量(有些可能更短,有些可能更长),因此你不能要求数字是唯一的,必须有某个地方有一些数据,无论你怎么做,它都无法保证唯一性。
其次,由于上述原因,也不可能使其可逆。因此,这是不可能的。
因此,我唯一可以看到的方法是,如果您有一个可枚举的数据源。 IE浏览器。你知道计算值之前的所有值。在这种情况下,您可以简单地为它们分配一个顺序ID。
答案 7 :(得分:0)
使用md5或sha喜欢:
string = substring(md5("05910395410"),0,4)
或编写自己的简单方法,例如
sum = 0
foreach(char c in string)
{
sum+=(int)c;
}
sum %= 9999