C# 从相同的ID集生成相同的ID

C# 从相同的ID集生成相同的ID,c#,hash,ssis,C#,Hash,Ssis,我有个问题要解释一下。我的想法是在C#中的SSIS中创建一个脚本,并使用该脚本为表中每个唯一的ID组合生成一个ID列表 我有一个SQL server表,它由两列组成。这些列是ID(我可以将它们设置为数字,但在原始格式中,它们是字母数字字符串)。我想从列2中连接到列1的一组ID中生成一个新ID Col1 Col2 Generated ID 1 1 1 2 => 1 1 3 ----------- 2 1 =>

我有个问题要解释一下。我的想法是在C#中的SSIS中创建一个脚本,并使用该脚本为表中每个唯一的ID组合生成一个ID列表

我有一个SQL server表,它由两列组成。这些列是ID(我可以将它们设置为数字,但在原始格式中,它们是字母数字字符串)。我想从列2中连接到列1的一组ID中生成一个新ID

 Col1  Col2    Generated ID
   1     1
   1     2    => 1
   1     3
 -----------
   2     1    => 2
   2     3
 -----------
   3     3
   3     1    => 1
   3     2
我在想一个散列函数,也许?但是我如何从1和3的集合中获得相同的ID呢?独立于秩序?我需要先把它们分类吗


我需要“10信誉”来发布一张图片,所以我希望我的插图能够解释这个问题…

作为进一步的示例,为了试图理解您的问题,您是否希望Col2中的以下值集返回类似于“123”的值,作为下面列出的所有情况下的“生成的ID”值,如是

Col2=>生成的ID

1,2,3=>123

1,3,2=>123

2,1,3=>123

2,3,1=>123

3,1,2=>123

3,2,1=>123

如果是,则根据上述假设并回答您的问题:

  • 是的,哈希函数可以做到这一点
  • 如何为集合1和集合3(在您的示例中)获得相同的“生成ID”将取决于您的GetHashCode()覆盖/实现
  • 是的,您可能需要排序,但同样,这取决于您的实现
由于您指的是在SSIS中使用C#脚本,一种可能的C#实现可能是实现一个(非常!)简单的哈希类,该类给出一组Col2值(对于每个数据集),简单地说:

  • 对Col2的值进行排序,以使它们按“正确”的顺序排列,然后
  • 返回已排序数据集的某些整数表示形式以获取哈希(例如,将int作为字符串连接,然后转换回int)
  • hash类可以在(base?)类的GetHashCode()函数中实例化,该函数传递Col2值并执行上述步骤(1)和(2),根据需要返回hash代码

    类似的内容可能适合您(假设您可以访问正在使用的.NET版本中的泛型):

    名称空间SimpleHashNamespace
    {
    公共类SimpleHash
    {
    私有只读列表数据;
    公共SimpleHash(列表col2)
    {
    _数据=col2;
    }
    public int GetMyHash()
    {
    _data.Sort();
    string stringHash=string.Join(“,_数据);
    return int.Parse(stringHash);//警告1:假设您总是有一个可转换的值
    }
    }
    公共类MyDataSet
    {
    私有只读列表_dataSetValues;
    公共MyDataSet(列出数据集值)
    {
    _数据集值=数据集值;
    }
    公共覆盖int GetHashCode()
    {
    SimpleHash SimpleHash=新的SimpleHash(_数据集值);
    return simpleHash.GetMyHash();//警告2:假定GetHashCode()必须返回int,则假定计算出的哈希可以适合int数据类型
    }
    }
    公共部分课程
    {
    私有静态void Main(字符串[]args)
    {
    //如何拆分Col1以获得int的数据集列表取决于您
    var myDataSet1=newmydataset(新列表(newint[]{1,2,3}));
    WriteLine(myDataSet1.GetHashCode());
    var myDataSet2=newmydataset(新列表(newint[]{2,1,3}));
    WriteLine(myDataSet2.GetHashCode());
    var myDataSet3=newmydataset(新列表(newint[]{3,2,1}));
    WriteLine(myDataSet3.GetHashCode());
    Console.ReadLine();
    }
    }
    }
    

    显然,这是一个微不足道的实现,但是鉴于问题的简单性,正如它所指定的那样,也许这就足够了?

    我会说使用计算列(带有哈希和行数)你能解释一下导致第三个生成的ID变为
    1
    的逻辑吗?这是我的问题。如何编写代码,为第二列中的唯一值集生成“唯一”的ID?如果值集相同,它将生成相同的ID。@BrijRajSingh-这不是会为每个集生成唯一的ID吗?我希望同一组值具有相同的ID,无论它们的顺序如何。啊,因此使用
    Col1
    作为
    Col2
    中的集合的边界标记。因此,第一组和第三组在
    Col2
    中具有相同的值集(顺序无关),因此它们获得相同的ID。第二个组获得一个新ID,因为它缺少值2。如果Col1的值为4,而Col2的值为3,1,那么您应该分配ID 2,对吗?
    CREATE TABLE T (Col1 INT, Col2 INT);
    GO
    
    INSERT INTO [dbo].[T]([Col1],[Col2])
    VALUES (1,1), (1,2), (1,3), (2,1), (2,3), (3,3), (3,1), (3,2), (2,3),(2,1);
    GO
    
    SELECT 
        T1.Col1,
        ( 
           SELECT Convert (VARCHAR,Col2)  + ','
           FROM T T2
           WHERE T2.Col1 = T1.Col1
           ORDER BY Col2
           FOR XML PATH('') 
        ) AS Col2_Cat
    INTO X
    FROM T T1
    GROUP BY Col1 ;
    
    
    SELECT T.Col1, T.Col2,  Y.Col3
    FROM T
    INNER JOIN 
    (
        SELECT X1.Col1, Min (X2.Col1) AS Col3  FROM X X1
        ----inner join X X2 on HASHBYTES ('SHA1',X1.Col2_Cat) = HASHBYTES('SHA1',X2.Col2_Cat)
        inner join X X2 on X1.Col2_Cat = X2.Col2_Cat
        GROUP BY X1.Col1
    ) AS Y
    ON T.Col1 = Y.Col1;
    
    
    DROP TABLE X
    DROP TABLE T
    
    CREATE TABLE T (Col1 INT, Col2 INT);
    GO
    
    INSERT INTO [dbo].[T]([Col1],[Col2])
    VALUES (1,1), (1,2), (1,3), (2,1), (2,3), (3,3), (3,1), (3,2), (2,3),(2,1);
    GO
    
    SELECT 
        T1.Col1,
        ( 
           SELECT Convert (VARCHAR,Col2)  + ','
           FROM T T2
           WHERE T2.Col1 = T1.Col1
           ORDER BY Col2
           FOR XML PATH('') 
        ) AS Col2_Cat
    INTO X
    FROM T T1
    GROUP BY Col1 ;
    
    
    SELECT T.Col1, T.Col2,  Y.Col3
    FROM T
    INNER JOIN 
    (
        SELECT X1.Col1, Min (X2.Col1) AS Col3  FROM X X1
        ----inner join X X2 on HASHBYTES ('SHA1',X1.Col2_Cat) = HASHBYTES('SHA1',X2.Col2_Cat)
        inner join X X2 on X1.Col2_Cat = X2.Col2_Cat
        GROUP BY X1.Col1
    ) AS Y
    ON T.Col1 = Y.Col1;
    
    
    DROP TABLE X
    DROP TABLE T