Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在表中存储唯一图像_Sql_Sql Server - Fatal编程技术网

Sql 在表中存储唯一图像

Sql 在表中存储唯一图像,sql,sql-server,Sql,Sql Server,我继承了一个数据库,其中包含.png图像,这些图像已被转换为byte[],最后被转换为ToBase64String,并保存在一个包含许多重复图像的表中。我想清理它,创建一个具有唯一映像的新表,但原始表没有与映像相关的主键。我提出了以下想法,但希望得到一些关于可行性的反馈或更好的建议 i) 创建包含2列的新表 PrimaryKey varchar(64) ImageBinary varbinary(MAX) ii)将Base64String转换回图像字节[],并以ImageBinary varb

我继承了一个数据库,其中包含.png图像,这些图像已被转换为
byte[]
,最后被转换为
ToBase64String
,并保存在一个包含许多重复图像的表中。我想清理它,创建一个具有唯一映像的新表,但原始表没有与映像相关的主键。我提出了以下想法,但希望得到一些关于可行性的反馈或更好的建议

i) 创建包含2列的新表

PrimaryKey varchar(64)
ImageBinary varbinary(MAX)
ii)将Base64String转换回图像字节[],并以
ImageBinary varbinary(MAX)

iii)使用HASHBYTES('SHA2_256',ImageBinary)对图像进行散列,并以
PrimaryKey varchar(64)

iv)将对任何新图像进行散列,并与现有主键散列进行比较

当前统计数据约为

  • 以db表示的图像约200000
  • DB70000中的唯一图像
  • 未来可能的唯一图像(以100万分贝为单位)
  • SQL中TOBASE64字符串的当前数据字符长度最小值:2900最大值:170000
两个主要问题

  • 对图像进行散列的原因是,我认为通过比较新图像散列和现有图像散列,可以加快检查重复图像的速度。另一种方法是比较完整的图像并使用整数作为主键。散列比较好吗

  • 如果首选散列,我并不需要加密散列,那么在SQL中可以用于此目的的最快/最短散列是什么

  • 我会存储一个整数uid-如果需要加入,比较4个字节要比16个字节或更多快得多。此外,如果需要,还可以存储散列,如果散列不是主键,还可以在散列上设置唯一的Constant
  • 我想是MD5,但它使用了更多的空间(20字节,而不是每个哈希16字节)
  • 最后,我不会在数据库中存储100万个文件
    看一看,这样您就可以通过数据库访问图像,但它存储在数据库之外。否则,进行数据库备份将成为一个问题

    请查看来自Red Gate的filestream教程:

    MD5的示例:

    SET IMG_MD5 = LOWER(SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', FIELD_NAME)), 3, 32) ) 
       ,IMG_SHA1 = sys.fn_varbintohexsubstring(0, HashBytes('SHA1', FIELD_NAME), 1, 0)
    

    SHA256将更快,尤其是对于更大的文件-块越大,速度越快algorithm@PanagiotisKanavos:是的,但是sha512是64字节,sha256是32字节的散列大小。如果我有一百万张图片,我会优化散列大小,而不是速度,特别是如果速度差不大的话。此外,根据automationrhapsody,Sha256和SH512速度较慢。我还将测试SQL server中的具体实现,看看哪一个最快。块大小越大,算法越快,因此MD5比SHA1慢,SHA1比SH256慢。如果将图像存储在数据库中,则无论如何都不能使用数据库未提供的任何算法,因此不能使用任何非加密哈希。您使用的是哪个版本?SQL Server 2017增加了对Python的支持,这意味着您可以使用Python包进行哈希或图像比较——事实上,添加Python是为了支持此类ML场景。使用它作为通用扩展机制是bonusIt在服务器上的SQL server 2016,它与C#集成,我可以根据不同的编码在SQL/C#之间复制散列。SQL server 2016提供了R,它还提供了用于散列和ML的包。SQLCLR本质上是.NET 3.5+或.NET 4-:它不理解任务或NuGet。我怀疑在R中找到CityHash或MurrudHash实现要比C#Check更容易。它支持许多散列算法,但SQLCLR对NuGet一无所知。您必须创建自己的SQLCLR项目,添加NuGet包,并希望没有不兼容