C# 从相同的ID集生成相同的ID
我有个问题要解释一下。我的想法是在C#中的SSIS中创建一个脚本,并使用该脚本为表中每个唯一的ID组合生成一个ID列表 我有一个SQL server表,它由两列组成。这些列是ID(我可以将它们设置为数字,但在原始格式中,它们是字母数字字符串)。我想从列2中连接到列1的一组ID中生成一个新IDC# 从相同的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 =>
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()覆盖/实现
- 是的,您可能需要排序,但同样,这取决于您的实现李>
名称空间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