在C#中将十个字符分类字符串转换为四个字符一

时间:2010-05-28 09:22:32

标签: c# hash

  1. 转换(散列)像3800290030这样的字符串的最佳方法是什么,它代表一个分类为四等字符的ID,如3450(我需要支持最多9999个类)。我们在10个字符空间中只有不到1000个类,它永远不会超过10k。
  2. 哈希需要是唯一的,并且对于相同的输入始终是相同的。
  3. 结果字符串应为数字(但它将在SQL Server中保存为char(4))。
  4. 我删除了可逆性的要求。

    这是我的解决方案,请评论:

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

8 个答案:

答案 0 :(得分:2)

  1. 您可以执行类似

    的操作

    str.GetHashCode()%9999 + 1;

  2. 由于您有超过9,999个字符串

  3. ,因此哈希不能是唯一的
  4. 它不是唯一的,所以它不可逆转
  5. 当然,如果你没有超过9999个不同的10个字符类,我的答案是错误的。

    如果你没有超过9999个类,你需要有一个从字符串id到其4个char表示的映射 - 例如 - 将stings保存在列表中,每个字符串键将是列表中的索引< / p>

答案 1 :(得分:2)

如果你想要颠倒这个过程,并且除了最多9999之外不了解id之外,我认为你需要使用翻译词典将每个id映射到它的简短版本。

即使没有必要扭转这个过程,我也不认为如果没有这样的字典,就有办法确定唯一的id。

这个简短的版本可以简单地用每个新id增加一个。

答案 2 :(得分:1)

  1. ehn不知道
  2. 独特很难,你有 - 在你的要求 - 4个字符 - 最多9999,会发生碰撞。
  3. 哈希不可逆转。数据丢失(显然)。

答案 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