• 关于 相似字符串 的搜索结果

问题

mysql 如何查询字符串匹配相似度?

落地花开啦 2019-12-01 20:00:14 2870 浏览量 回答数 1

问题

二进制码的数据如何搜索

蛮大人123 2019-12-01 19:52:26 1196 浏览量 回答数 1

问题

mysql 字符串匹配相似度?报错

爱吃鱼的程序员 2020-06-22 11:18:07 0 浏览量 回答数 1

新用户福利专场,云服务器ECS低至102元/年

新用户专场,1核2G 102元/年起,2核4G 699.8元/年起

问题

求解类似数据如何搜索!

a123456678 2019-12-01 20:11:53 1009 浏览量 回答数 1

问题

停用词过滤后,为什么下游字符串相似度出现stop_words字段

mysoft00012 2019-12-01 19:26:50 941 浏览量 回答数 1

问题

如何在MYSQL中计算两个字符串之间的相似度?mysql

保持可爱mmm 2020-05-16 22:00:07 1 浏览量 回答数 1

回答

string类的查找函数:int find(char c, int pos = 0) const;//从pos开始查找字符c在当前字符串的位置int find(const char *s, int pos = 0) const;//从pos开始查找字符串s在当前串中的位置int find(const char *s, int pos, int n) const;//从pos开始查找字符串s中前n个字符在当前串中的位置int find(const string &s, int pos = 0) const;//从pos开始查找字符串s在当前串中的位置//查找成功时返回所在位置,失败返回string::npos的值 int rfind(char c, int pos = npos) const;//从pos开始从后向前查找字符c在当前串中的位置int rfind(const char *s, int pos = npos) const;int rfind(const char *s, int pos, int n = npos) const;int rfind(const string &s,int pos = npos) const;//从pos开始从后向前查找字符串s中前n个字符组成的字符串在当前串中的位置,成功返回所在位置,失败时返回string::npos的值 int find_first_of(char c, int pos = 0) const;//从pos开始查找字符c第一次出现的位置int find_first_of(const char *s, int pos = 0) const;int find_first_of(const char *s, int pos, int n) const;int find_first_of(const string &s,int pos = 0) const;//从pos开始查找当前串中第一个在s的前n个字符组成的数组里的字符的位置。查找失败返回string::npos int find_first_not_of(char c, int pos = 0) const;int find_first_not_of(const char *s, int pos = 0) const;int find_first_not_of(const char *s, int pos,int n) const;int find_first_not_of(const string &s,int pos = 0) const;//从当前串中查找第一个不在串s中的字符出现的位置,失败返回string::npos int find_last_of(char c, int pos = npos) const;int find_last_of(const char *s, int pos = npos) const;int find_last_of(const char *s, int pos, int n = npos) const;int find_last_of(const string &s,int pos = npos) const; int find_last_not_of(char c, int pos = npos) const;int find_last_not_of(const char *s, int pos = npos) const;int find_last_not_of(const char *s, int pos, int n) const;int find_last_not_of(const string &s,int pos = npos) const;//find_last_of和find_last_not_of与find_first_of和find_first_not_of相似,只不过是从后向前查找

管理贝贝 2019-12-02 01:26:17 0 浏览量 回答数 0

回答

设主串为S = "s1s2 ... sn",模式为T = "t1t2 ... tm" 当“失配”(si <> tj)时,模式串T “向右滑动” 的可行距离有多远? 或者说,下一步si 应该与模式串中的哪个字符比较,这完全取决于模式串,与主串无关 因此,可以预先为模式串设定一个数组next[j],当“失配” (si <> tj)时,i 不变,j 改为next[j] 0 当j = 1时,不比较 next[j] = max{k, 1 <= k < j 且"t1 … tk-1" = "tj-(k-1) … tj-1"} 1 其他情况 next[j] 函数表征着模式T 中最大相同首子串和尾子串(真子串)的长度 相似部分越多,则next[j] 函数越大 既表示模式T 字符间的相关度越高,也表示j 位置以前与主串部分匹配的字符数越多 next[j] 越大,模式串向右滑动得越远

一键天涯 2019-12-02 01:26:05 0 浏览量 回答数 0

回答

此消息表示您正在尝试比较WHEREor ON子句中的数字和字符串。在您的查询中,唯一可能发生的地方是ON ac.company_code = ta.company_code;。确保它们具有相似的声明,或使用显式CAST将数字转换为字符串。 如果关闭strict模式,则错误应变为警告。来源:stack overflow

保持可爱mmm 2020-05-17 22:30:17 0 浏览量 回答数 0

回答

正则表达式是用来检索和匹配复核某个固定模式的字符串,语义匹配则是从相似性的角度找到语义相似的语句,比如“你的ip是?”和“你的ip地址是多少?”这两句话在语义上是高度相似的。

保持可爱mmm 2020-03-26 22:36:40 0 浏览量 回答数 0

问题

文本分析模块使用

hit_whcheng 2019-12-01 21:37:41 3254 浏览量 回答数 1

回答

第一个,是你逐位判断的代码里面,只要$count大于$len的10%就不用循环下去了,相似度必然小于0.9。第二个,既然数据是自己生成的,那可以在生成时一并储存拆分值的十六进制数。举个例子,比如1024位的字符串,每16位为一个单位,共拆分为64个单位,每个单位的16位二进制数转换成4位16进制数,和这个1024位的字符串一并储存起来。每次比较时,先逐个比较这64个单位的数值是否相同,如果有58个相同,那相似度就有0.9以上。如果只有57个相同呢?剩下不同的7个4位16进制数,一共有4*7=28位十六进制数字,然后进行逐个比较。 有a个相同,则1024位转化成256位的十六进制数的数字上的相似度等于((574)+a) / (644) ,他要大于0.9。也就是说,在逐个比较时,a大于等于0.9644 - 57*4 就不用判断了,相似度大于0.9。如果只有a-1个相同呢?把不同的28-(a-1)位转化为2进制,按上面的方法,逐个比较。有b个一样,相似度为((5716)+(a-1)4+b) / 1024,他要大于0.9,即b大于等于0.91024 - 5716 - (a-1)*4时,相似度大于0.9。把上面的57和a-1换成任意的x y就是实际情况了。虽然计算量还是很大,不过相比逐个比较小了很多了。另外,计算出每两个16位二进制数的单位的相似度的时候可以缓存起来,留给256位和64位比较时用。

蛮大人123 2019-12-02 01:46:00 0 浏览量 回答数 0

回答

我能想到算法上的两个优化点。第一个,是你逐位判断的代码里面,只要$count大于$len的10%就不用循环下去了,相似度必然小于0.9。第二个,既然数据是自己生成的,那可以在生成时一并储存拆分值的十六进制数。举个例子,比如1024位的字符串,每16位为一个单位,共拆分为64个单位,每个单位的16位二进制数转换成4位16进制数,和这个1024位的字符串一并储存起来。每次比较时,先逐个比较这64个单位的数值是否相同,如果有58个相同,那相似度就有0.9以上。如果只有57个相同呢?剩下不同的7个4位16进制数,一共有4*7=28位十六进制数字,然后进行逐个比较。 有a个相同,则1024位转化成256位的十六进制数的数字上的相似度等于((574)+a) / (644) ,他要大于0.9。也就是说,在逐个比较时,a大于等于0.9644 - 57*4 就不用判断了,相似度大于0.9。如果只有a-1个相同呢?把不同的28-(a-1)位转化为2进制,按上面的方法,逐个比较。有b个一样,相似度为((5716)+(a-1)4+b) / 1024,他要大于0.9,即b大于等于0.91024 - 5716 - (a-1)*4时,相似度大于0.9。把上面的57和a-1换成任意的x y就是实际情况了。虽然计算量还是很大,不过相比逐个比较小了很多了。另外,计算出每两个16位二进制数的单位的相似度的时候可以缓存起来,留给256位和64位比较时用。仔细想想量好像也很大……就不继续写了。

a123456678 2019-12-02 02:59:02 0 浏览量 回答数 0

问题

关于PHP比较数组相似度的方法

吴孟桥 2019-12-01 19:46:07 1021 浏览量 回答数 1

回答

阿里云会对每个访问的请求进行身份验证,所以无论使用 HTTP 还是 HTTPS 协议提交请求,都需要在请求中包含签名(Signature)信息。通过使用 Access Key ID 和 Access Key Secret 进行对称加密的方法来验证请求的发送者身份。Access Key ID 和 Access Key Secret 由阿里云官方颁发给访问者(可以通过阿里云官方网站申请和管理),其中 Access Key ID 用于标识访问者的身份;Access Key Secret 是用于加密签名字符串和服务器端验证签名字符串的密钥,必须严格保密,只有阿里云和用户知道。 注意:阿里云提供了多种语言的 SDK 及第三方 SDK,可以免去您对签名算法进行编码的麻烦。您可以从 这里 了解更多阿里云 SDK 的信息。 签名操作 您在访问时,需要按照下面的方法对请求进行签名处理。 使用请求参数构造规范化的请求字符串(Canonicalized Query String)。i. 参数排序。按照参数名称的字典顺序对请求中所有的请求参数(包括“公共请求参数”和接口的自定义参数,但不包括“公共请求参数”中的 Signature 参数)进行排序。 注意:当使用 GET 方法提交请求时,这些参数就是请求 URI 中的参数部分(即 URI 中“?”之后由“&”连接的部分)。 ii. 参数编码。对排序之后的请求参数的名称和值分别用 UTF-8 字符集进行 URL 编码。编码的规则如下。 对于字符 A~Z、a~z、0~9 以及字符“-”、“_”、“.”、“~”不编码; 对于其它字符编码成 %XY 的格式,其中 XY 是字符对应 ASCII 码的 16 进制表示。比如英文的双引号(”)对 应的编码为 %22; 对于扩展的 UTF-8 字符,编码成 %XY%ZA… 的格式; 英文空格( )要编码成 %20,而不是加号(+)。该编码方式和一般采用的 application/x-www-form-urlencoded MIME 格式编码算法(比如 Java 标准库中的 java.net.URLEncoder 的实现)相似,但又有所不同。实现时,可以先用标准库的方式进行编码,然后把编码后的字符串中加号(+)替换成 %20、星号(*)替换成 %2A、%7E 替换回波浪号(~),即可得到上述规则描述的编码字符串。这个算法可以用下面的 percentEncode 方法来实现: private static final String ENCODING = "UTF-8"; private static String percentEncode(String value) throws UnsupportedEncodingException { return value != null ? URLEncoder.encode(value, ENCODING).replace("+", "%20").replace("*", "%2A").replace("%7E", "~") : null; } iii. 将编码后的参数名称和值用英文等号(=)进行连接。iv. 将等号连接得到的参数组合按步骤 i 排好的顺序依次使用“&”符号连接,即得到规范化请求字符串。 将上一步构造的规范化字符串按照下面的规则构造成待签名的字符串。 StringToSign= HTTPMethod + “&” + percentEncode(“/”) + ”&” + percentEncode(CanonicalizedQueryString) 其中: HTTPMethod 是提交请求用的 HTTP 方法,比如 GET。 percentEncode(“/”) 是按照步骤 1.i 中描述的 URL 编码规则对字符 “/” 进行编码得到的值,即 %2F。 percentEncode(CanonicalizedQueryString) 是对步骤 1 中构造的规范化请求字符串按步骤 1.ii 中描述的 URL 编码规则编码后得到的字符串。 3.按照 RFC2104 的定义,计算待签名字符串 StringToSign 的 HMAC 值。 注意:计算签名时使用的 Key 就是您持有的 Access Key Secret 并加上一个 “&” 字符(ASCII:38),使用的哈希算法是 SHA1。 4.按照 Base64 编码规则把上面的 HMAC 值编码成字符串,即得到签名值(Signature)。5.将得到的签名值作为 Signature 参数添加到请求参数中,即完成对请求签名的过程。 注意:得到的签名值在作为最后的请求参数值提交给 ECS 服务器时,要和其它参数一样,按照 RFC3986 的规则进行 URL 编码。 示例 以 DescribeRegions 为例,假设使用的 Access Key Id 为 testid, Access Key Secret 为 testsecret。 那么签名前的请求 URL 为: http://ecs.aliyuncs.com/?TimeStamp=2016-02-23T12:46:24Z&Format=XML&AccessKeyId=testid&Action=DescribeRegions&SignatureMethod=HMAC-SHA1&SignatureNonce=3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf&Version=2014-05-26&SignatureVersion=1.0 计算得到的待签名字符串 StringToSign 为: GET&%2F&AccessKeyId%3Dtestid&Action%3DDescribeRegions&Format%3DXML&SignatureMethod%3DHMAC-SHA1&SignatureNonce%3D3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf&SignatureVersion%3D1.0&TimeStamp%3D2016-02-23T12%253A46%253A24Z&Version%3D2014-05-26 因为 Access Key Secret 为 testsecret,所以用于计算 HMAC 的 Key 为 testsecret&,计算得到的签名值为: CT9X0VtwR86fNWSnsc6v8YGOjuE=将签名作为 Signature 参数加入到 URL 请求中,最后得到的 URL 为: http://ecs.aliyuncs.com/?SignatureVersion=1.0&Action=DescribeRegions&Format=XML&SignatureNonce=3ee

保持可爱mmm 2020-03-29 13:20:31 0 浏览量 回答数 0

问题

E-MapReduce API参考签名机制是什么?

nicenelly 2019-12-01 21:22:59 979 浏览量 回答数 0

问题

ECS 服务中的签名机制是什么

boxti 2019-12-01 21:46:25 1082 浏览量 回答数 0

回答

阿里云会对每个访问的请求进行身份验证,所以无论使用 HTTP 还是 HTTPS 协议提交请求,都需要在请求中包含签名(Signature)信息。通过使用 Access Key ID 和 Access Key Secret 进行对称加密的方法来验证请求的发送者身份。Access Key ID 和 Access Key Secret 由阿里云官方颁发给访问者(可以通过阿里云官方网站申请和管理),其中 Access Key ID 用于标识访问者的身份;Access Key Secret 是用于加密签名字符串和服务器端验证签名字符串的密钥,必须严格保密,只有阿里云和用户知道。 注意:阿里云提供了多种语言的 SDK 及第三方 SDK,可以免去您对签名算法进行编码的麻烦。您可以从 这里 了解更多阿里云 SDK 的信息。 签名操作 您在访问时,需要按照下面的方法对请求进行签名处理。 使用请求参数构造规范化的请求字符串(Canonicalized Query String)。 i. 参数排序。 按照参数名称的字典顺序对请求中所有的请求参数(包括“公共请求参数”和接口的自定义参数,但不包括“公共请求参数”中的 Signature 参数)进行排序。 注意:当使用 GET 方法提交请求时,这些参数就是请求 URI 中的参数部分(即 URI 中“?”之后由“&”连接的部分)。 ii. 参数编码。 对排序之后的请求参数的名称和值分别用 UTF-8 字符集进行 URL 编码。编码的规则如下。 对于字符 A~Z、a~z、0~9 以及字符“-”、“_”、“.”、“~”不编码; 对于其它字符编码成 %XY 的格式,其中 XY 是字符对应 ASCII 码的 16 进制表示。比如英文的双引号(”)对 应的编码为 %22; 对于扩展的 UTF-8 字符,编码成 %XY%ZA… 的格式; 英文空格( )要编码成 %20,而不是加号(+)。 该编码方式和一般采用的 application/x-www-form-urlencoded MIME 格式编码算法(比如 Java 标准库中的 java.net.URLEncoder 的实现)相似,但又有所不同。实现时,可以先用标准库的方式进行编码,然后把编码后的字符串中加号(+)替换成 %20、星号(*)替换成 %2A、%7E 替换回波浪号(~),即可得到上述规则描述的编码字符串。这个算法可以用下面的 percentEncode 方法来实现: private static final String ENCODING = "UTF-8"; private static String percentEncode(String value) throws UnsupportedEncodingException { return value != null ? URLEncoder.encode(value, ENCODING).replace("+", "%20").replace("*", "%2A").replace("%7E", "~") : null; } iii. 将编码后的参数名称和值用英文等号(=)进行连接。 iv. 将等号连接得到的参数组合按步骤 i 排好的顺序依次使用“&”符号连接,即得到规范化请求字符串。 将上一步构造的规范化字符串按照下面的规则构造成待签名的字符串。 StringToSign= HTTPMethod + “&” + percentEncode(“/”) + ”&” + percentEncode(CanonicalizedQueryString) 其中: HTTPMethod 是提交请求用的 HTTP 方法,比如 GET。 percentEncode(“/”) 是按照步骤 1.i 中描述的 URL 编码规则对字符 “/” 进行编码得到的值,即 %2F。 percentEncode(CanonicalizedQueryString) 是对步骤 1 中构造的规范化请求字符串按步骤 1.ii 中描述的 URL 编码规则编码后得到的字符串。 3.按照 RFC2104 的定义,计算待签名字符串 StringToSign 的 HMAC 值。 注意:计算签名时使用的 Key 就是您持有的 Access Key Secret 并加上一个 “&” 字符(ASCII:38),使用的哈希算法是 SHA1。 4.按照 Base64 编码规则把上面的 HMAC 值编码成字符串,即得到签名值(Signature)。 5.将得到的签名值作为 Signature 参数添加到请求参数中,即完成对请求签名的过程。 注意:得到的签名值在作为最后的请求参数值提交给 ECS 服务器时,要和其它参数一样,按照 RFC3986 的规则进行 URL 编码。 示例 以 DescribeRegions 为例,假设使用的 Access Key Id 为 testid, Access Key Secret 为 testsecret。 那么签名前的请求 URL 为: http://ecs.aliyuncs.com/?TimeStamp=2016-02-23T12:46:24Z&Format=XML&AccessKeyId=testid&Action=DescribeRegions&SignatureMethod=HMAC-SHA1&SignatureNonce=3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf&Version=2014-05-26&SignatureVersion=1.0 计算得到的待签名字符串 StringToSign 为: GET&%2F&AccessKeyId%3Dtestid&Action%3DDescribeRegions&Format%3DXML&SignatureMethod%3DHMAC-SHA1&SignatureNonce%3D3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf&SignatureVersion%3D1.0&TimeStamp%3D2016-02-23T12%253A46%253A24Z&Version%3D2014-05-26 因为 Access Key Secret 为 testsecret,所以用于计算 HMAC 的 Key 为 testsecret&,计算得到的签名值为: CT9X0VtwR86fNWSnsc6v8YGOjuE= 将签名作为 Signature 参数加入到 URL 请求中,最后得到的 URL 为: http://ecs.aliyuncs.com/?SignatureVersion=1.0&Action=DescribeRegions&Format=XML&SignatureNonce=3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf&Version=2014-05-26&AccessKeyId=testid&Signature=CT9X0VtwR86fNWSnsc6v8YGOjuE%3D&SignatureMethod=HMAC-SHA1&TimeStamp=2016-02-23T12%3A46%3A24Z

保持可爱mmm 2020-03-27 16:07:24 0 浏览量 回答数 0

回答

阿里云会对每个访问的请求进行身份验证,所以无论使用 HTTP 还是 HTTPS 协议提交请求,都需要在请求中包含签名(Signature)信息。通过使用 Access Key ID 和 Access Key Secret 进行对称加密的方法来验证请求的发送者身份。 Access Key ID 和 Access Key Secret 由阿里云官方颁发给访问者(可以通过阿里云官方网站申请和管理),其中 Access Key ID 用于标识访问者的身份; Access Key Secret 是用于加密签名字符串和服务器端验证签名字符串的密钥,必须严格保密,只有阿里云和用户知道。 说明 阿里云提供了多种语言的 SDK 及第三方 SDK,可以免去您对签名算法进行编码的麻烦。更多阿里云 SDK 的信息,参见 阿里云开发工具包。 签名操作 您在访问时,需要按照下面的方法对请求进行签名处理。 使用请求参数构造规范化的请求字符串(Canonicalized Query String)。 参数排序。 按照参数名称的字典顺序对请求中所有的请求参数(包括“公共请求参数”和接口的自定义参数,但不包括“公共请求参数”中的 Signature 参数)进行排序。 说明 当使用 GET 方法提交请求时,这些参数就是请求 URI 中的参数部分(即 URI 中“?”之后由“&”连接的部分)。 参数编码。 对排序之后的请求参数的名称和值分别用 UTF-8 字符集进行 URL 编码。编码的规则如下。 对于字符 A~Z、a~z、0~9 以及字符“-”、“_”、“.”、“~”不编码; 对于其它字符编码成 %XY 的格式,其中 XY 是字符对应 ASCII 码的 16 进制表示。比如英文的双引号(”)对 应的编码为 %22; 对于扩展的 UTF-8 字符,编码成 %XY%ZA… 的格式; 英文空格( )要编码成 %20,而不是加号(+)。 该编码方式和一般采用的 application/x-www-form-urlencoded MIME 格式编码算法(比如 Java 标准库中的 java.net.URLEncoder 的实现)相似,但又有所不同。实现时,可以先用标准库的方式进行编码,然后把编码后的字符串中加号(+)替换成 %20、星号(*)替换成 %2A、%7E 替换回波浪号(~),即可得到上述规则描述的编码字符串。这个算法可以用下面的 percentEncode 方法来实现: private static final String ENCODING = "UTF-8"; private static String percentEncode(String value) throws UnsupportedEncodingException { return value != null ? URLEncoder.encode(value, ENCODING).replace("+", "%20").replace("*", "%2A").replace("%7E", "~") : null; } 将编码后的参数名称和值用英文等号(=)进行连接。 将等号连接得到的参数组合按步骤 i 排好的顺序依次使用“&”符号连接,即得到规范化请求字符串。 将上一步构造的规范化字符串按照下面的规则构造成待签名的字符串。 StringToSign= HTTPMethod + “&” + percentEncode(“/”) + ”&” + percentEncode(CanonicalizedQueryString) 其中: HTTPMethod 是提交请求用的 HTTP 方法,比如 GET。 percentEncode(“/”) 是按照步骤 1.ii 中描述的 URL 编码规则对字符 “/” 进行编码得到的值,即 %2F。 percentEncode(CanonicalizedQueryString) 是对步骤 1 中构造的规范化请求字符串按步骤 1.ii 中描述的 URL 编码规则编码后得到的字符串。 按照 RFC2104 的定义,计算待签名字符串 StringToSign 的 HMAC 值。 说明 计算签名时使用的 Key 就是您持有的 Access Key Secret 并加上一个 “&” 字符(ASCII:38),使用的哈希算法是 SHA1。 按照 Base64 编码规则把上面的 HMAC 值编码成字符串,即得到签名值(Signature)。 将得到的签名值作为 Signature 参数添加到请求参数中,即完成对请求签名的过程。 说明 得到的签名值在作为最后的请求参数值提交给视频直播服务器的时候,要和其他参数一样,按照 RFC3986 的规则进行 URL 编码)。 示例 以 DescribeLiveSnapshotConfig 为例,签名前的请求 URL 为: http://live.aliyuncs.com/?Format=XML&SignatureMethod=HMAC-SHA1&Action=DescribeLiveSnapshotConfig&AccessKeyId=testid&RegionId=cn-shanghai&ServiceCode=live&DomainName=test.com&AppName=test&SignatureNonce=c2fe8fbb-2977-4414-8d39-348d02419c1c&Version=2016-11-01&SignatureVersion=1.0&Timestamp=2017-06-14T09:51:14Z 那么 StringToSign 就是: GET&%2F&AccessKeyId%3Dtestid&Action%3DDescribeLiveSnapshotConfig&AppName%3Dtest&DomainName%3Dtest.com&Format%3DXML&RegionId%3Dcn-shanghai&ServiceCode%3Dlive&SignatureMethod%3DHMAC-SHA1&SignatureNonce%3Dc2fe8fbb-2977-4414-8d39-348d02419c1c&SignatureVersion%3D1.0&Timestamp%3D2017-06-14T09%253A51%253A14Z&Version%3D2016-11-01 假如使用的 Access Key Id是“testid”, Access Key Secret是“testsecret”,用于计算 HMAC 的 Key 就是 “testsecret&”,则计算得到的签名值是: 3I5a3myPjp8FXWT4rvxX5pKb/aw= 签名后的请求 URL 为(注意增加了 Signature 参数): http://live.aliyuncs.com/?Format=XML&SignatureMethod=HMAC-SHA1&Signature=3I5a3myPjp8FXWT4rvxX5pKb%2Faw%3D&Tim

保持可爱mmm 2020-03-29 22:16:07 0 浏览量 回答数 0

回答

阿里云会对每个访问的请求进行身份验证,所以无论使用 HTTP 还是 HTTPS 协议提交请求,都需要在请求中包含签名(Signature)信息。通过使用 Access Key ID 和 Access Key Secret 进行对称加密的方法来验证请求的发送者身份。 Access Key ID 和 Access Key Secret 由阿里云官方颁发给访问者(可以通过阿里云官方网站申请和管理),其中 Access Key ID 用于标识访问者的身份; Access Key Secret 是用于加密签名字符串和服务器端验证签名字符串的密钥,必须严格保密,只有阿里云和用户知道。 说明 阿里云提供了多种语言的 SDK 及第三方 SDK,可以免去您对签名算法进行编码的麻烦。更多阿里云 SDK 的信息,参见 阿里云开发工具包。 签名操作 您在访问时,需要按照下面的方法对请求进行签名处理。 使用请求参数构造规范化的请求字符串(Canonicalized Query String)。 参数排序。 按照参数名称的字典顺序对请求中所有的请求参数(包括“公共请求参数”和接口的自定义参数,但不包括“公共请求参数”中的 Signature 参数)进行排序。 说明:当使用 GET 方法提交请求时,这些参数就是请求 URI 中的参数部分(即 URI 中“?”之后由“&”连接的部分)。 参数编码。 对排序之后的请求参数的名称和值分别用 UTF-8 字符集进行 URL 编码。编码的规则如下: 对于字符 A~Z、a~z、0~9 以及字符“-”、“_”、“.”、“~”不编码 对于其它字符编码成 %XY 的格式,其中 XY 是字符对应 ASCII 码的 16 进制表示。例如:英文的双引号(”)对 应的编码为 %22。 对于扩展的 UTF-8 字符,编码成 %XY%ZA… 的格式。 英文空格( )要编码成 %20,而不是加号(+)。 该编码方式和一般采用的 application/x-www-form-urlencoded MIME 格式编码算法(比如 Java 标准库中的 java.net.URLEncoder 的实现)相似,但又有所不同。实现时,可以先用标准库的方式进行编码,然后把编码后的字符串中加号(+)替换成 %20、星号(*)替换成 %2A、%7E 替换回波浪号(~),即可得到上述规则描述的编码字符串。这个算法可以用下面的 percentEncode 方法来实现: { private static final String ENCODING = "UTF-8"; private static String percentEncode(String value) throws UnsupportedEncodingException { return value != null ? URLEncoder.encode(value, ENCODING).replace("+", "%20").replace("*", "%2A").replace("%7E", "~") : null; } 将编码后的参数名称和值用英文等号(=)进行连接。 将等号连接得到的参数组合按步骤 i 排好的顺序依次使用“&”符号连接,即得到规范化请求字符串。 将上一步构造的规范化字符串按照下面的规则构造成待签名的字符串。 StringToSign= HTTPMethod + “&” + percentEncode(“/”) + ”&” + percentEncode(CanonicalizedQueryString) 其中: HTTPMethod 是提交请求用的 HTTP 方法,比如 GET。 percentEncode(“/”) 是按照步骤 1.ii 中描述的 URL 编码规则对字符 “/” 进行编码得到的值,即 %2F。 percentEncode(CanonicalizedQueryString) 是对步骤 1 中构造的规范化请求字符串按步骤 1.ii 中描述的 URL 编码规则编码后得到的字符串。 按照 RFC2104 的定义,计算待签名字符串 StringToSign 的 HMAC 值。 说明:计算签名时使用的 Key 就是您持有的 Access Key Secret 并加上一个 “&” 字符(ASCII:38),使用的哈希算法是 SHA1。 按照 Base64 编码规则把上面的 HMAC 值编码成字符串,即得到签名值(Signature)。 将得到的签名值作为 Signature 参数添加到请求参数中,即完成对请求签名的过程。 说明:得到的签名值在作为最后的请求参数值提交给视频直播服务器的时候,要和其他参数一样,按照 RFC3986 的规则进行 URL 编码)。 示例 以 DescribeGroup 为例,签名前的请求 URL 为: http://vs.aliyuncs.com/?Format=JSON&SignatureMethod=HMAC-SHA1&Action=DescribeGroup&AccessKeyId=testid&SignatureNonce=c2fe8fbb-2977-4414-8d39-348d02419c1c&Version=2018-12-12&SignatureVersion=1.0&Timestamp=2019-02-28T00:00:00Z 那么 StringToSign 就是: GET&%2F&AccessKeyId%3Dtestid%26Action%3DDescribeGroup%26Format%3DJSON%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3Dc2fe8fbb-2977-4414-8d39-348d02419c1c%26SignatureVersion%3D1.0%26Timestamp%3D2019-02-28T00%253A00%253A00Z%26Version%3D2018-12-12 假如使用的 Access Key Id是“testid”, Access Key Secret是“testsecret”,用于计算 HMAC 的 Key 就是 “testsecret&”,则计算得到的签名值是: sgILSN6tpSSOFF3I1NKD+/z0Nos= 签名后的请求 URL 为(注意增加了 Signature 参数): http://live.aliyuncs.com/?Format=JSON&SignatureMethod=HMAC-SHA1&Action=DescribeGroup&AccessKeyId=testid&SignatureNonce=c2fe8fbb-2977-4414-8d39-348d02419c1c&Version=2018-12-12&SignatureVersion=1.0&Timestamp=2019-02-28T00:00:00Z&Signature=sgILSN6tpSSOFF3I1NKD%2B%2Fz0Nos%3D

保持可爱mmm 2020-03-29 16:13:25 0 浏览量 回答数 0

问题

Python 爬虫的工具列表

驻云科技 2019-12-01 21:44:42 4079 浏览量 回答数 2

回答

您引用的MySQL文档实际上比您提到的要多。它还说, A“ '”加引号的字符串内“ '”可以写为“ ''”。 (此外,您已链接到表5.0的MySQL 5.0版本。特殊字符转义序列,当前版本是5.6 —但当前的表8.1。特殊字符转义序列看起来很相似。) 我认为有关该backslash_quote (string)参数的Postgres注释是有益的: 这控制引号是否可以用'字符串文字表示。表示引号的首选SQL标准方法是将其加倍(''),但PostgreSQL在历史上也已接受'。但是,使用'会产生安全风险... 对我来说,使用双引号引起来的总体和长期选择比使用反斜杠来避免使用单引号更好。 现在,如果您还想在等式中添加语言选择,SQL数据库及其非标准古怪的选择以及查询框架的选择,那么您可能最终会获得不同的选择。您没有提供太多有关约束的信息。来源:stack overflow

保持可爱mmm 2020-05-10 19:23:10 0 浏览量 回答数 0

回答

如果只是简单地相似度比较可以考虑简化为 对比两个字符串中相等的子串的最长长度。最长公共子序列问题 LCS对序列 1,3,5,4,2,6,8,7来说,序列3,4,8,7 是它的一个子序列。对于一个长度为n的序列,它一共有2^n 个子序列,有(2^n – 1)个非空子序列。公共子序列 : 顾名思义,如果序列C既是序列A的子序列,同时也是序列B的子序列,则称它为序列A和序列B的公共子序列。

feeqi 2019-12-02 01:52:04 0 浏览量 回答数 0

问题

用SQL清理数据

游客syccbxcrjoo2g 2019-12-01 22:07:08 5 浏览量 回答数 0

回答

概述 对于每一次 HTTP 或者 HTTPS 协议请求,我们会根据访问中的签名信息验证访问请求者身份。具体由使用 AccessKeyID 和 AccessKeySecret 对称加密验证实现。 AccessKeyID 和 AccessKeySecret 可在控制台 AccessKey 管理 页面获得。其中 AccessKeyID 是访问者身份,AccessKeySecret 是加密签名字符串和服务器端验证签名字符串的密钥,必须严格保密谨防泄露。 说明:我们提供了多种编程语言的 SDK 及第三方 SDK,可以免去您签名的烦恼。更多详情,请下载 SDK。 步骤 1. 构造规范化请求字符串 排序参数。排序规则以首字母顺序排序,排序参数包括 公共请求参数 和接口自定义参数,不包括公共请求参数中的 Signature 参数。 说明:当使用 GET 方法提交请求时,这些参数就是请求 URL 中的参数部分。即 URL 中 ? 之后由 & 连接的部分。 编码参数。使用 UTF-8 字符集按照 RFC3986 规则编码请求参数和参数取值,编码规则如下: 字符 A~Z、a~z、0~9 以及字符 -、_、.、~ 不编码。 其它字符编码成 %XY 的格式,其中 XY 是字符对应 ASCII 码的 16 进制。示例:半角双引号(")对应 %22。 扩展的 UTF-8 字符,编码成 %XY%ZA… 的格式。 空格( )编码成 %20,而不是加号(+)。 该编码方式与 application/x-www-form-urlencoded MIME 格式编码算法相似,但又有所不同。 如果您使用的是 Java 标准库中的 java.net.URLEncoder,可以先用标准库中 percentEncode 编码,随后将编码后的字符中加号(+)替换为 %20、星号(*)替换为 %2A、%7E 替换为波浪号(~),即可得到上述规则描述的编码字符串。 使用等号(=)连接编码后的请求参数和参数取值。 使用与号(&)连接编码后的请求参数,注意参数排序与 步骤 1 一致。 步骤 2. 构造签名字符串 构造待签名字符串 StringToSign。 您可以同样使用 percentEncode 处理上一步构造的规范化请求字符串,规则如下: StringToSign= HTTPMethod + "&" + //HTTPMethod:发送请求的 HTTP 方法,例如 GET。 percentEncode("/") + "&" + //percentEncode("/"):字符(/)UTF-8 编码得到的值,即 %2F。 percentEncode(CanonicalizedQueryString) //您的规范化请求字符串。 计算 HMAC 值。 按照 RFC2104 的定义,使用上述步骤得到的字符串计算签名 HMAC 值。 注意:计算签名时使用的 Key 就是您持有的 AccessKeySecret 并加上一个 & 字符(ASCII:38),使用的哈希算法是 SHA1。 计算签名值。 按照 Base64 编码规则 把上一步骤中的 HMAC 值编码成字符串,即得到签名值(Signature)。 添加签名。 将得到的签名值作为 Signature 参数添加到请求参数中,即完成请求签名过程。 注意:得到的签名值在作为最后的请求参数值提交给服务器时,也要按照 RFC3986 规则进行 URL 编码。 请求示例 以 GetVideoPlayAuth 为例,假设使用的 AccessKeyId 为 testAccessKeyId, AccessKeySecret 为 testAccessKeySecret。 那么签名前的请求 URL 为: http://vod.cn-shanghai.aliyuncs.com/?TimeStamp=2017-10-10T12:02:54Z&Format=JSON&AccessKeyId=testAccessKeyId&Action=GetVideoPlayAuth&SignatureMethod=HMAC-SHA1&SignatureNonce=8f8a035d-6496-4268-afd4-67c22837e38d&Version=2017-03-21&SignatureVersion=1.0&VideoId=5aed81b74ba84920be578cdfe004af4b 计算得到的待签名字符串 StringToSign 为: GET&%2F&AccessKeyId%3DtestAccessKeyId&Action%3DGetVideoPlayAuth&Format%3DJSON&SignatureMethod%3DHMAC-SHA1&SignatureNonce%3D8f8a035d-6496-4268-afd4-67c22837e38d&SignatureVersion%3D1.0&Timestamp%3D2017-10-10T12%253A02%253A54Z&Version%3D2017-03-21&VideoId%3D5aed81b74ba84920be578cdfe004af4b 因为 AccessKeySecret 为 testAccessKeySecret,所以用于计算 HMAC 的 Key 为 testAccessKeySecret&,计算得到的签名值为: Ibgh7y8Vp47LBuAsf5Xhi1SvDss%3D 将签名作为 Signature 参数加入到 URL 请求中,最后得到的 URL 为: http://vod.cn-shanghai.aliyuncs.com?AccessKeyId=testAccessKeyId&Action=GetVideoPlayAuth&Format=JSON&SignatureMethod=HMAC-SHA1&SignatureNonce=8f8a035d-6496-4268-afd4-67c22837e38d&SignatureVersion=1.0&Timestamp=2017-10-10T12%3A02%3A54Z&Version=2017-03-21&VideoId=5aed81b74ba84920be578cdfe004af4b&Signature=Ibgh7y8Vp47LBuAsf5Xhi1SvDss%3D Java 示例代码 以下将为您介绍OpenAPI公共参数中需要您通过代码生成的参数,其他参数请根据文档填写具体值(本示例不需要依赖第三方的库包,可以直接使用)。 1. 生成签名串Signature 构造签名字符串分为以下几个步骤进行: 1.1. 构造规范化的请求字符串 参数排序及URL编码。其中,参数排序是指将参数名称以字母序升序排列。 /*对所有参数名称和参数值做URL编码*/ public static List<String> getAllParams(Map<String, String> publicParams, Map<String, String> privateParams) { List<String> encodeParams = new ArrayList<String>(); if (publicParams != null) { for (String key : publicParams.keySet()) { String value = publicParams.get(key); //将参数和值都urlEncode一下。 String encodeKey = percentEncode(key); String encodeVal = percentEncode(value); encodeParams.add(encodeKey + "=" + encodeVal); } } if (privateParams != null) { for (String key : privateParams.keySet()) { String value = privateParams.get(key); //将参数和值都urlEncode一下。 String encodeKey = percentEncode(key); String encodeVal = percentEncode(value); encodeParams.add(encodeKey + "=" + encodeVal); } } return encodeParams; } /*获取 CanonicalizedQueryString*/ public static String getCQS(List<String> allParams) { ParamsComparator paramsComparator = new ParamsComparator(); Collections.sort(allParams, paramsComparator); String cqString = ""; for (int i = 0; i < allParams.size(); i++) { cqString += allParams.get(i); if (i != allParams.size() - 1) { cqString += "&"; } } return cqString; } /*字符串参数比较器,按字母序升序*/ public static class ParamsComparator implements Comparator<String> { @Override public int compare(String lhs, String rhs) { return lhs.compareTo(rhs); } } 1.2. 构造待签名的字符串 /*构造待签名的字符串*/ String StringToSign = httpMethod + "&" + percentEncode("/") + "&" + percentEncode(CanonicalizedQueryString); /*特殊字符替换为转义字符*/ public static String percentEncode(String value) { try { String urlEncodeOrignStr = URLEncoder.encode(value, "UTF-8"); String plusReplaced = urlEncodeOrignStr.replace("+", "%20"); String starReplaced = plusReplaced.replace("*", "%2A"); String waveReplaced = starReplaced.replace("%7E", "~"); return waveReplaced; } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return value; } 1.3. 计算待签名字符串的HMAC值 public static byte[] hmacSHA1Signature(String accessKeySecret, String stringToSign) { try { String key = accessKeySecret + "&"; try { SecretKeySpec signKey = new SecretKeySpec(key.getBytes(), "HmacSHA1"); Mac mac = Mac.getInstance("HmacSHA1"); mac.init(signKey); return mac.doFinal(stringToSign.getBytes()); } catch (Exception e) { throw new SignatureException("Failed to generate HMAC : " + e.getMessage()); } } catch (SignatureException e) { e.printStackTrace(); } return null; } 1.4. 编码得到最终签名值 按照 Base64 编码规则将1.3中计算得到的HMAC值编码成字符串,得到最终签名值(Signature)。 public static String newStringByBase64(byte[] bytes) throws UnsupportedEncodingException { if (bytes == null || bytes.length == 0) { return null; } return new String(new BASE64Encoder().encode(bytes)); } 生成时间戳TimeStamp 生成TimeStamp,为UTC时间戳,如:2017-10-10T12:02:54Z /*生成当前UTC时间戳Time*/ public static String generateTimestamp() { Date date = new Date(System.currentTimeMillis()); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); df.setTimeZone(new SimpleTimeZone(0, "GMT")); return df.format(date); } 生成随机数SignatureNonce public static String generateRandom() { String signatureNonce = UUID.randomUUID().toString(); return signatureNonce; } 至此,已经为您重点介绍了如何生成OpenAPI核心参数的代码示例,为了方便您快速使用签名机制,您可以在 OpenAPI调用示例 下载完整的OpenAPI调用示例Java代码。 更多参考 服务端SDK 可以直接使用服务端接口SDK,来避免自行实现签名机制,SDK支持以下语言版本: Java SDK Python SDK PHP SDK .NET SDK Node.js SDK Go SDK C/C++ SDK 服务端接口SDK封装了 点播服务API 的使用,也提供了各接口的代码示例。 其它签名示例 如确实想自行计算签名,可参考阿里云SDK的签名实现代码: PHP 签名示例 Python签名示例 .NET 签名示例 Go 签名示例 Node.js 签名示例 C/C++ 签名示例

保持可爱mmm 2020-03-30 12:07:33 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 物联网平台会对每个接口访问请求的发送者进行身份验证,所以无论使用HTTP还是HTTPS协议提交请求,都需要在请求中包含签名(Signature)信息。 签名方法 签名时,您需在控制台 Access Key 管理 页面查看您的阿里云账号的 AccessKeyId 和 AccessKeySecret,然后进行对称加密。其中,AccessKeyId 用于标识访问者身份;AccessKeySecret 是用于加密签名字符串和服务器端验证签名字符串的密钥,必须严格保密。 说明 物联网平台提供了Java、Python、PHP等语言的服务端SDK。使用我们提供的SDK,可以免去签名过程。请参见SDK下载及各SDK的使用说明。 请按照下面的方法对请求进行签名: 构造规范化的请求字符串(Canonicalized Query String)。 排序参数。 按参数名的字典顺序,对请求参数进行排序,包括 公共请求参数(不包括 Signature 参数)和接口的自定义参数。 说明 当使用 GET 方法提交请求时,这些参数就是请求 URI 中的参数部分,即 URI 中?之后由&连接的部分。 对参数名称和参数值进行 URL 编码。 使用UTF-8字符集按照 RFC3986 规则编码请求参数名和参数值。编码规则如下: 字符 A~Z、a~z、0~9 以及字符-、_、.、~不编码。 其它字符编码成%XY的格式,其中XY是字符对应 ASCII 码的 16 进制表示。比如英文的双引号"对应的编码为%22。 扩展的UTF-8字符,编码成%XY%ZA…的格式。 英文空格要编码成%20,而不是加号+。 该编码方式与application/x-www-form-urlencoded MIME格式编码算法相似,但又有所不同。 如果您使用的是Java标准库中的java.net.URLEncoder,可以先用标准库中percentEncode编码,随后将编码后的字符中加号+替换为%20、星号*替换为%2A、%7E替换为波浪号~,即可得到上述规则描述的编码字符串。 private static final String ENCODING = "UTF-8"; private static String percentEncode(String value) throws UnsupportedEncodingException { return value != null ? URLEncoder.encode(value, ENCODING).replace("+", "%20").replace("*", "%2A").replace("%7E", "~") : null; } 使用等号=连接编码后的请求参数名和参数值。 使用与号&连接编码后的请求参数。参数排序与步骤 a 的排序一致。 完成后,即获得规范化请求字符串(CanonicalizedQueryString)。 构造签名字符串。 可以使用 percentEncode 处理步骤 1 得到的规范化字符串,构造签名字符串。可参考如下规则: StringToSign= HTTPMethod + "&" + //HTTPMethod:发送请求的 HTTP 方法,例如 GET。 percentEncode("/") + "&" + //percentEncode("/"):字符(/)UTF-8 编码得到的值,即 %2F。 percentEncode(CanonicalizedQueryString) //您的规范化请求字符串。 计算 HMAC 值。 按照 RFC2104 的定义,使用步骤 2 得到的字符串StringToSign计算签名 HMAC 值。示例使用的是Java Base64编码方法。 Signature = Base64( HMAC-SHA1( AccessSecret, UTF-8-Encoding-Of(StringToSign) ) ) 说明 计算签名时,使用的 Key 就是您的 AccessKeySecret 并加上一个与号&字符(ASCII:38)。使用的哈希算法是 SHA1。 计算签名值。 按照 Base64 编码规则把步骤 3 中的 HMAC 值编码成字符串,即得到签名值(Signature)。 添加签名。 将得到的签名值作为 Signature 参数,按照 RFC3986 的规则进行 URL 编码后,再添加到请求参数中,即完成对请求签名的过程。 示例1:参数拼接法 以调用Pub接口为例。假设您的AccessKeyId=testid,AccessKeySecret=testsecret。 签名前的请求URL:http://iot.cn-shanghai.aliyuncs.com/?MessageContent=aGVsbG93b3JsZA%3D&Action=Pub&Timestamp=2017-10-02T09%3A39%3A41Z&SignatureVersion=1.0&ServiceCode=iot&Format=XML&Qos=0&SignatureNonce=0715a395-aedf-4a41-bab7-746b43d38d88&Version=2017-04-20&AccessKeyId=testid&SignatureMethod=HMAC-SHA1&RegionId=cn-shanghai&ProductKey=12345abcdeZ&TopicFullName=%2FproductKey%2Ftestdevice%2Fget 计算得到的待签名字符串StringToSign:GET&%2F&AccessKeyId%3Dtestid%26Action%3DPub%26Format%3DXML%26MessageContent%3DaGVsbG93b3JsZA%253D%26ProductKey%3D12345abcdeZ%26Qos%3D0%26RegionId%3Dcn-shanghai%26ServiceCode%3Diot%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3D0715a395-aedf-4a41-bab7-746b43d38d88%26SignatureVersion%3D1.0%26Timestamp%3D2017-10-02T09%253A39%253A41Z%26TopicFullName%3D%252FproductKey%252Ftestdevice%252Fget%26Version%3D2017-04-20 计算签名值。 因为AccessKeySecret=testsecret,用于计算的Key为testsecret&,计算得到的签名值为: Y9eWn4nF8QPh3c4zAFkM/k/u7eA= 将签名作为Signature参数加入到URL请求中,最后得到的URL为:http://iot.cn-shanghai.aliyuncs.com/?MessageContent=aGVsbG93b3JsZA%3D&Action=Pub&Timestamp=2017-10-02T09%3A39%3A41Z&SignatureVersion=1.0&ServiceCode=iot&Format=XML&Qos=0&SignatureNonce=0715a395-aedf-4a41-bab7-746b43d38d88&Version=2017-04-20&AccessKeyId=testid&Signature=Y9eWn4nF8QPh3c4zAFkM%2Fk%2Fu7eA%3D&SignatureMethod=HMAC-SHA1&RegionId=cn-shanghai&ProductKey=12345abcdeZ&TopicFullName=%2FproductKey%2Ftestdevice%2Fget 示例2:JAVA 语言编码法 本示例代码不需要依赖第三方的库包,可以直接使用。签名步骤如下所示。 构造规范化的请求字符串(参数排序及对参数名称和参数值进行URL编码)。public static Map<String, String> splitQueryString(String url) throws URISyntaxException, UnsupportedEncodingException { URI uri = new URI(url); String query = uri.getQuery(); final String[] pairs = query.split("&"); TreeMap<String, String> queryMap = new TreeMap<String, String>(); for (String pair : pairs) { final int idx = pair.indexOf("="); final String key = idx > 0 ? pair.substring(0, idx) : pair; if (!queryMap.containsKey(key)) { queryMap.put(key, URLDecoder.decode(pair.substring(idx + 1), CHARSET_UTF8)); } } return queryMap; } /** 对参数名称和参数值进行URL编码**/ public static String generate(String method, Map<String, String> parameter, String accessKeySecret) throws Exception { String signString = generateSignString(method, parameter); System.out.println("signString---" + signString); byte[] signBytes = hmacSHA1Signature(accessKeySecret + "&", signString); String signature = newStringByBase64(signBytes); System.out.println("signature---" + signature); if ("POST".equals(method)) return signature; return URLEncoder.encode(signature, "UTF-8"); } 构造待签名的字符串。public static String generateSignString(String httpMethod, Map<String, String> parameter) throws IOException { TreeMap<String, String> sortParameter = new TreeMap<String, String>(); sortParameter.putAll(parameter); String canonicalizedQueryString = UrlUtil.generateQueryString( sortParameter, true); if (null == httpMethod) { throw new RuntimeException("httpMethod can not be empty"); } /** 构造待签名的字符串* */ StringBuilder stringToSign = new StringBuilder(); stringToSign.append(httpMethod).append(SEPARATOR); stringToSign.append(percentEncode("/")).append(SEPARATOR); stringToSign.append(percentEncode(canonicalizedQueryString)); return stringToSign.toString(); } 计算待签名字符串的 HMAC 值。public static byte[] hmacSHA1Signature(String secret, String baseString) throws Exception { if (isEmpty(secret)) { throw new IOException("secret can not be empty"); } if (isEmpty(baseString)) { return null; } Mac mac = Mac.getInstance("HmacSHA1"); SecretKeySpec keySpec = new SecretKeySpec( secret.getBytes(CHARSET_UTF8), ALGORITHM); mac.init(keySpec); return mac.doFinal(baseString.getBytes(CHARSET_UTF8)); } private static boolean isEmpty(String str) { return (str == null || str.length() == 0); } 按照 Base64 编码规则编码成字符串,获取签名值。public static String newStringByBase64(byte[] bytes) throws UnsupportedEncodingException { if (bytes == null || bytes.length == 0) { return null; } return new String(new BASE64Encoder().encode(bytes)); } public static String composeStringToSign(Map<String, String> queries) { String[] sortedKeys = (String[]) queries.keySet() .toArray(new String[0]); Arrays.sort(sortedKeys); StringBuilder canonicalizedQueryString = new StringBuilder(); for (String key : sortedKeys) { canonicalizedQueryString.append("&").append(percentEncode(key)) .append("=") .append(percentEncode((String) queries.get(key))); } StringBuilder stringToSign = new StringBuilder(); stringToSign.append("GET"); stringToSign.append("&"); stringToSign.append(percentEncode("/")); stringToSign.append("&"); stringToSign.append(percentEncode(canonicalizedQueryString.toString() .substring(1))); return stringToSign.toString(); } public static String percentEncode(String value) { try { return value == null ? null : URLEncoder .encode(value, CHARSET_UTF8).replace("+", "%20") .replace("*", "%2A").replace("%7E", "~"); } catch (Exception e) { } return ""; } /** * get SignatureNonce ** */ public static String getUniqueNonce() { UUID uuid = UUID.randomUUID(); return uuid.toString(); } /** * get timestamp **/ public static String getISO8601Time() { Date nowDate = new Date(); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); df.setTimeZone(new SimpleTimeZone(0, "GMT")); return df.format(nowDate); } 添加签名。public static String composeUrl(String endpoint, Map<String, String> queries) throws UnsupportedEncodingException { Map<String, String> mapQueries = queries; StringBuilder urlBuilder = new StringBuilder(""); urlBuilder.append("http"); urlBuilder.append("://").append(endpoint); if (-1 == urlBuilder.indexOf("?")) { urlBuilder.append("/?"); } urlBuilder.append(concatQueryString(mapQueries)); return urlBuilder.toString(); } public static String concatQueryString(Map<String, String> parameters) throws UnsupportedEncodingException { if (null == parameters) { return null; } StringBuilder urlBuilder = new StringBuilder(""); for (Map.Entry<String, String> entry : parameters.entrySet()) { String key = (String) entry.getKey(); String val = (String) entry.getValue(); urlBuilder.append(encode(key)); if (val != null) { urlBuilder.append("=").append(encode(val)); } urlBuilder.append("&"); } int strIndex = urlBuilder.length(); if (parameters.size() > 0) { urlBuilder.deleteCharAt(strIndex - 1); } return urlBuilder.toString(); } public static String encode(String value) throws UnsupportedEncodingException { return URLEncoder.encode(value, "UTF-8"); } }

2019-12-01 23:11:55 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 物联网平台会对每个接口访问请求的发送者进行身份验证,所以无论使用HTTP还是HTTPS协议提交请求,都需要在请求中包含签名(Signature)信息。 签名方法 签名时,您需在控制台 Access Key 管理 页面查看您的阿里云账号的 AccessKeyId 和 AccessKeySecret,然后进行对称加密。其中,AccessKeyId 用于标识访问者身份;AccessKeySecret 是用于加密签名字符串和服务器端验证签名字符串的密钥,必须严格保密。 说明 物联网平台提供了Java、Python、PHP等语言的服务端SDK。使用我们提供的SDK,可以免去签名过程。请参见SDK下载及各SDK的使用说明。 请按照下面的方法对请求进行签名: 构造规范化的请求字符串(Canonicalized Query String)。 排序参数。 按参数名的字典顺序,对请求参数进行排序,包括 公共请求参数(不包括 Signature 参数)和接口的自定义参数。 说明 当使用 GET 方法提交请求时,这些参数就是请求 URI 中的参数部分,即 URI 中?之后由&连接的部分。 对参数名称和参数值进行 URL 编码。 使用UTF-8字符集按照 RFC3986 规则编码请求参数名和参数值。编码规则如下: 字符 A~Z、a~z、0~9 以及字符-、_、.、~不编码。 其它字符编码成%XY的格式,其中XY是字符对应 ASCII 码的 16 进制表示。比如英文的双引号"对应的编码为%22。 扩展的UTF-8字符,编码成%XY%ZA…的格式。 英文空格要编码成%20,而不是加号+。 该编码方式与application/x-www-form-urlencoded MIME格式编码算法相似,但又有所不同。 如果您使用的是Java标准库中的java.net.URLEncoder,可以先用标准库中percentEncode编码,随后将编码后的字符中加号+替换为%20、星号*替换为%2A、%7E替换为波浪号~,即可得到上述规则描述的编码字符串。 private static final String ENCODING = "UTF-8"; private static String percentEncode(String value) throws UnsupportedEncodingException { return value != null ? URLEncoder.encode(value, ENCODING).replace("+", "%20").replace("*", "%2A").replace("%7E", "~") : null; } 使用等号=连接编码后的请求参数名和参数值。 使用与号&连接编码后的请求参数。参数排序与步骤 a 的排序一致。 完成后,即获得规范化请求字符串(CanonicalizedQueryString)。 构造签名字符串。 可以使用 percentEncode 处理步骤 1 得到的规范化字符串,构造签名字符串。可参考如下规则: StringToSign= HTTPMethod + "&" + //HTTPMethod:发送请求的 HTTP 方法,例如 GET。 percentEncode("/") + "&" + //percentEncode("/"):字符(/)UTF-8 编码得到的值,即 %2F。 percentEncode(CanonicalizedQueryString) //您的规范化请求字符串。 计算 HMAC 值。 按照 RFC2104 的定义,使用步骤 2 得到的字符串StringToSign计算签名 HMAC 值。示例使用的是Java Base64编码方法。 Signature = Base64( HMAC-SHA1( AccessSecret, UTF-8-Encoding-Of(StringToSign) ) ) 说明 计算签名时,使用的 Key 就是您的 AccessKeySecret 并加上一个与号&字符(ASCII:38)。使用的哈希算法是 SHA1。 计算签名值。 按照 Base64 编码规则把步骤 3 中的 HMAC 值编码成字符串,即得到签名值(Signature)。 添加签名。 将得到的签名值作为 Signature 参数,按照 RFC3986 的规则进行 URL 编码后,再添加到请求参数中,即完成对请求签名的过程。 示例1:参数拼接法 以调用Pub接口为例。假设您的AccessKeyId=testid,AccessKeySecret=testsecret。 签名前的请求URL:http://iot.cn-shanghai.aliyuncs.com/?MessageContent=aGVsbG93b3JsZA%3D&Action=Pub&Timestamp=2017-10-02T09%3A39%3A41Z&SignatureVersion=1.0&ServiceCode=iot&Format=XML&Qos=0&SignatureNonce=0715a395-aedf-4a41-bab7-746b43d38d88&Version=2017-04-20&AccessKeyId=testid&SignatureMethod=HMAC-SHA1&RegionId=cn-shanghai&ProductKey=12345abcdeZ&TopicFullName=%2FproductKey%2Ftestdevice%2Fget 计算得到的待签名字符串StringToSign:GET&%2F&AccessKeyId%3Dtestid%26Action%3DPub%26Format%3DXML%26MessageContent%3DaGVsbG93b3JsZA%253D%26ProductKey%3D12345abcdeZ%26Qos%3D0%26RegionId%3Dcn-shanghai%26ServiceCode%3Diot%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3D0715a395-aedf-4a41-bab7-746b43d38d88%26SignatureVersion%3D1.0%26Timestamp%3D2017-10-02T09%253A39%253A41Z%26TopicFullName%3D%252FproductKey%252Ftestdevice%252Fget%26Version%3D2017-04-20 计算签名值。 因为AccessKeySecret=testsecret,用于计算的Key为testsecret&,计算得到的签名值为: Y9eWn4nF8QPh3c4zAFkM/k/u7eA= 将签名作为Signature参数加入到URL请求中,最后得到的URL为:http://iot.cn-shanghai.aliyuncs.com/?MessageContent=aGVsbG93b3JsZA%3D&Action=Pub&Timestamp=2017-10-02T09%3A39%3A41Z&SignatureVersion=1.0&ServiceCode=iot&Format=XML&Qos=0&SignatureNonce=0715a395-aedf-4a41-bab7-746b43d38d88&Version=2017-04-20&AccessKeyId=testid&Signature=Y9eWn4nF8QPh3c4zAFkM%2Fk%2Fu7eA%3D&SignatureMethod=HMAC-SHA1&RegionId=cn-shanghai&ProductKey=12345abcdeZ&TopicFullName=%2FproductKey%2Ftestdevice%2Fget 示例2:JAVA 语言编码法 本示例代码不需要依赖第三方的库包,可以直接使用。签名步骤如下所示。 构造规范化的请求字符串(参数排序及对参数名称和参数值进行URL编码)。public static Map<String, String> splitQueryString(String url) throws URISyntaxException, UnsupportedEncodingException { URI uri = new URI(url); String query = uri.getQuery(); final String[] pairs = query.split("&"); TreeMap<String, String> queryMap = new TreeMap<String, String>(); for (String pair : pairs) { final int idx = pair.indexOf("="); final String key = idx > 0 ? pair.substring(0, idx) : pair; if (!queryMap.containsKey(key)) { queryMap.put(key, URLDecoder.decode(pair.substring(idx + 1), CHARSET_UTF8)); } } return queryMap; } /** 对参数名称和参数值进行URL编码**/ public static String generate(String method, Map<String, String> parameter, String accessKeySecret) throws Exception { String signString = generateSignString(method, parameter); System.out.println("signString---" + signString); byte[] signBytes = hmacSHA1Signature(accessKeySecret + "&", signString); String signature = newStringByBase64(signBytes); System.out.println("signature---" + signature); if ("POST".equals(method)) return signature; return URLEncoder.encode(signature, "UTF-8"); } 构造待签名的字符串。public static String generateSignString(String httpMethod, Map<String, String> parameter) throws IOException { TreeMap<String, String> sortParameter = new TreeMap<String, String>(); sortParameter.putAll(parameter); String canonicalizedQueryString = UrlUtil.generateQueryString( sortParameter, true); if (null == httpMethod) { throw new RuntimeException("httpMethod can not be empty"); } /** 构造待签名的字符串* */ StringBuilder stringToSign = new StringBuilder(); stringToSign.append(httpMethod).append(SEPARATOR); stringToSign.append(percentEncode("/")).append(SEPARATOR); stringToSign.append(percentEncode(canonicalizedQueryString)); return stringToSign.toString(); } 计算待签名字符串的 HMAC 值。public static byte[] hmacSHA1Signature(String secret, String baseString) throws Exception { if (isEmpty(secret)) { throw new IOException("secret can not be empty"); } if (isEmpty(baseString)) { return null; } Mac mac = Mac.getInstance("HmacSHA1"); SecretKeySpec keySpec = new SecretKeySpec( secret.getBytes(CHARSET_UTF8), ALGORITHM); mac.init(keySpec); return mac.doFinal(baseString.getBytes(CHARSET_UTF8)); } private static boolean isEmpty(String str) { return (str == null || str.length() == 0); } 按照 Base64 编码规则编码成字符串,获取签名值。public static String newStringByBase64(byte[] bytes) throws UnsupportedEncodingException { if (bytes == null || bytes.length == 0) { return null; } return new String(new BASE64Encoder().encode(bytes)); } public static String composeStringToSign(Map<String, String> queries) { String[] sortedKeys = (String[]) queries.keySet() .toArray(new String[0]); Arrays.sort(sortedKeys); StringBuilder canonicalizedQueryString = new StringBuilder(); for (String key : sortedKeys) { canonicalizedQueryString.append("&").append(percentEncode(key)) .append("=") .append(percentEncode((String) queries.get(key))); } StringBuilder stringToSign = new StringBuilder(); stringToSign.append("GET"); stringToSign.append("&"); stringToSign.append(percentEncode("/")); stringToSign.append("&"); stringToSign.append(percentEncode(canonicalizedQueryString.toString() .substring(1))); return stringToSign.toString(); } public static String percentEncode(String value) { try { return value == null ? null : URLEncoder .encode(value, CHARSET_UTF8).replace("+", "%20") .replace("*", "%2A").replace("%7E", "~"); } catch (Exception e) { } return ""; } /** * get SignatureNonce ** */ public static String getUniqueNonce() { UUID uuid = UUID.randomUUID(); return uuid.toString(); } /** * get timestamp **/ public static String getISO8601Time() { Date nowDate = new Date(); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); df.setTimeZone(new SimpleTimeZone(0, "GMT")); return df.format(nowDate); } 添加签名。public static String composeUrl(String endpoint, Map<String, String> queries) throws UnsupportedEncodingException { Map<String, String> mapQueries = queries; StringBuilder urlBuilder = new StringBuilder(""); urlBuilder.append("http"); urlBuilder.append("://").append(endpoint); if (-1 == urlBuilder.indexOf("?")) { urlBuilder.append("/?"); } urlBuilder.append(concatQueryString(mapQueries)); return urlBuilder.toString(); } public static String concatQueryString(Map<String, String> parameters) throws UnsupportedEncodingException { if (null == parameters) { return null; } StringBuilder urlBuilder = new StringBuilder(""); for (Map.Entry<String, String> entry : parameters.entrySet()) { String key = (String) entry.getKey(); String val = (String) entry.getValue(); urlBuilder.append(encode(key)); if (val != null) { urlBuilder.append("=").append(encode(val)); } urlBuilder.append("&"); } int strIndex = urlBuilder.length(); if (parameters.size() > 0) { urlBuilder.deleteCharAt(strIndex - 1); } return urlBuilder.toString(); } public static String encode(String value) throws UnsupportedEncodingException { return URLEncoder.encode(value, "UTF-8"); } }

2019-12-01 23:11:56 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 物联网平台会对每个接口访问请求的发送者进行身份验证,所以无论使用HTTP还是HTTPS协议提交请求,都需要在请求中包含签名(Signature)信息。 签名方法 签名时,您需在控制台 Access Key 管理 页面查看您的阿里云账号的 AccessKeyId 和 AccessKeySecret,然后进行对称加密。其中,AccessKeyId 用于标识访问者身份;AccessKeySecret 是用于加密签名字符串和服务器端验证签名字符串的密钥,必须严格保密。 说明 物联网平台提供了Java、Python、PHP等语言的服务端SDK。使用我们提供的SDK,可以免去签名过程。请参见SDK下载及各SDK的使用说明。 请按照下面的方法对请求进行签名: 构造规范化的请求字符串(Canonicalized Query String)。 排序参数。 按参数名的字典顺序,对请求参数进行排序,包括 公共请求参数(不包括 Signature 参数)和接口的自定义参数。 说明 当使用 GET 方法提交请求时,这些参数就是请求 URI 中的参数部分,即 URI 中?之后由&连接的部分。 对参数名称和参数值进行 URL 编码。 使用UTF-8字符集按照 RFC3986 规则编码请求参数名和参数值。编码规则如下: 字符 A~Z、a~z、0~9 以及字符-、_、.、~不编码。 其它字符编码成%XY的格式,其中XY是字符对应 ASCII 码的 16 进制表示。比如英文的双引号"对应的编码为%22。 扩展的UTF-8字符,编码成%XY%ZA…的格式。 英文空格要编码成%20,而不是加号+。 该编码方式与application/x-www-form-urlencoded MIME格式编码算法相似,但又有所不同。 如果您使用的是Java标准库中的java.net.URLEncoder,可以先用标准库中percentEncode编码,随后将编码后的字符中加号+替换为%20、星号*替换为%2A、%7E替换为波浪号~,即可得到上述规则描述的编码字符串。 private static final String ENCODING = "UTF-8"; private static String percentEncode(String value) throws UnsupportedEncodingException { return value != null ? URLEncoder.encode(value, ENCODING).replace("+", "%20").replace("*", "%2A").replace("%7E", "~") : null; } 使用等号=连接编码后的请求参数名和参数值。 使用与号&连接编码后的请求参数。参数排序与步骤 a 的排序一致。 完成后,即获得规范化请求字符串(CanonicalizedQueryString)。 构造签名字符串。 可以使用 percentEncode 处理步骤 1 得到的规范化字符串,构造签名字符串。可参考如下规则: StringToSign= HTTPMethod + "&" + //HTTPMethod:发送请求的 HTTP 方法,例如 GET。 percentEncode("/") + "&" + //percentEncode("/"):字符(/)UTF-8 编码得到的值,即 %2F。 percentEncode(CanonicalizedQueryString) //您的规范化请求字符串。 计算 HMAC 值。 按照 RFC2104 的定义,使用步骤 2 得到的字符串StringToSign计算签名 HMAC 值。示例使用的是Java Base64编码方法。 Signature = Base64( HMAC-SHA1( AccessSecret, UTF-8-Encoding-Of(StringToSign) ) ) 说明 计算签名时,使用的 Key 就是您的 AccessKeySecret 并加上一个与号&字符(ASCII:38)。使用的哈希算法是 SHA1。 计算签名值。 按照 Base64 编码规则把步骤 3 中的 HMAC 值编码成字符串,即得到签名值(Signature)。 添加签名。 将得到的签名值作为 Signature 参数,按照 RFC3986 的规则进行 URL 编码后,再添加到请求参数中,即完成对请求签名的过程。 示例1:参数拼接法 以调用Pub接口为例。假设您的AccessKeyId=testid,AccessKeySecret=testsecret。 签名前的请求URL:http://iot.cn-shanghai.aliyuncs.com/?MessageContent=aGVsbG93b3JsZA%3D&Action=Pub&Timestamp=2017-10-02T09%3A39%3A41Z&SignatureVersion=1.0&ServiceCode=iot&Format=XML&Qos=0&SignatureNonce=0715a395-aedf-4a41-bab7-746b43d38d88&Version=2017-04-20&AccessKeyId=testid&SignatureMethod=HMAC-SHA1&RegionId=cn-shanghai&ProductKey=12345abcdeZ&TopicFullName=%2FproductKey%2Ftestdevice%2Fget 计算得到的待签名字符串StringToSign:GET&%2F&AccessKeyId%3Dtestid%26Action%3DPub%26Format%3DXML%26MessageContent%3DaGVsbG93b3JsZA%253D%26ProductKey%3D12345abcdeZ%26Qos%3D0%26RegionId%3Dcn-shanghai%26ServiceCode%3Diot%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3D0715a395-aedf-4a41-bab7-746b43d38d88%26SignatureVersion%3D1.0%26Timestamp%3D2017-10-02T09%253A39%253A41Z%26TopicFullName%3D%252FproductKey%252Ftestdevice%252Fget%26Version%3D2017-04-20 计算签名值。 因为AccessKeySecret=testsecret,用于计算的Key为testsecret&,计算得到的签名值为: Y9eWn4nF8QPh3c4zAFkM/k/u7eA= 将签名作为Signature参数加入到URL请求中,最后得到的URL为:http://iot.cn-shanghai.aliyuncs.com/?MessageContent=aGVsbG93b3JsZA%3D&Action=Pub&Timestamp=2017-10-02T09%3A39%3A41Z&SignatureVersion=1.0&ServiceCode=iot&Format=XML&Qos=0&SignatureNonce=0715a395-aedf-4a41-bab7-746b43d38d88&Version=2017-04-20&AccessKeyId=testid&Signature=Y9eWn4nF8QPh3c4zAFkM%2Fk%2Fu7eA%3D&SignatureMethod=HMAC-SHA1&RegionId=cn-shanghai&ProductKey=12345abcdeZ&TopicFullName=%2FproductKey%2Ftestdevice%2Fget 示例2:JAVA 语言编码法 本示例代码不需要依赖第三方的库包,可以直接使用。签名步骤如下所示。 构造规范化的请求字符串(参数排序及对参数名称和参数值进行URL编码)。public static Map<String, String> splitQueryString(String url) throws URISyntaxException, UnsupportedEncodingException { URI uri = new URI(url); String query = uri.getQuery(); final String[] pairs = query.split("&"); TreeMap<String, String> queryMap = new TreeMap<String, String>(); for (String pair : pairs) { final int idx = pair.indexOf("="); final String key = idx > 0 ? pair.substring(0, idx) : pair; if (!queryMap.containsKey(key)) { queryMap.put(key, URLDecoder.decode(pair.substring(idx + 1), CHARSET_UTF8)); } } return queryMap; } /** 对参数名称和参数值进行URL编码**/ public static String generate(String method, Map<String, String> parameter, String accessKeySecret) throws Exception { String signString = generateSignString(method, parameter); System.out.println("signString---" + signString); byte[] signBytes = hmacSHA1Signature(accessKeySecret + "&", signString); String signature = newStringByBase64(signBytes); System.out.println("signature---" + signature); if ("POST".equals(method)) return signature; return URLEncoder.encode(signature, "UTF-8"); } 构造待签名的字符串。public static String generateSignString(String httpMethod, Map<String, String> parameter) throws IOException { TreeMap<String, String> sortParameter = new TreeMap<String, String>(); sortParameter.putAll(parameter); String canonicalizedQueryString = UrlUtil.generateQueryString( sortParameter, true); if (null == httpMethod) { throw new RuntimeException("httpMethod can not be empty"); } /** 构造待签名的字符串* */ StringBuilder stringToSign = new StringBuilder(); stringToSign.append(httpMethod).append(SEPARATOR); stringToSign.append(percentEncode("/")).append(SEPARATOR); stringToSign.append(percentEncode(canonicalizedQueryString)); return stringToSign.toString(); } 计算待签名字符串的 HMAC 值。public static byte[] hmacSHA1Signature(String secret, String baseString) throws Exception { if (isEmpty(secret)) { throw new IOException("secret can not be empty"); } if (isEmpty(baseString)) { return null; } Mac mac = Mac.getInstance("HmacSHA1"); SecretKeySpec keySpec = new SecretKeySpec( secret.getBytes(CHARSET_UTF8), ALGORITHM); mac.init(keySpec); return mac.doFinal(baseString.getBytes(CHARSET_UTF8)); } private static boolean isEmpty(String str) { return (str == null || str.length() == 0); } 按照 Base64 编码规则编码成字符串,获取签名值。public static String newStringByBase64(byte[] bytes) throws UnsupportedEncodingException { if (bytes == null || bytes.length == 0) { return null; } return new String(new BASE64Encoder().encode(bytes)); } public static String composeStringToSign(Map<String, String> queries) { String[] sortedKeys = (String[]) queries.keySet() .toArray(new String[0]); Arrays.sort(sortedKeys); StringBuilder canonicalizedQueryString = new StringBuilder(); for (String key : sortedKeys) { canonicalizedQueryString.append("&").append(percentEncode(key)) .append("=") .append(percentEncode((String) queries.get(key))); } StringBuilder stringToSign = new StringBuilder(); stringToSign.append("GET"); stringToSign.append("&"); stringToSign.append(percentEncode("/")); stringToSign.append("&"); stringToSign.append(percentEncode(canonicalizedQueryString.toString() .substring(1))); return stringToSign.toString(); } public static String percentEncode(String value) { try { return value == null ? null : URLEncoder .encode(value, CHARSET_UTF8).replace("+", "%20") .replace("*", "%2A").replace("%7E", "~"); } catch (Exception e) { } return ""; } /** * get SignatureNonce ** */ public static String getUniqueNonce() { UUID uuid = UUID.randomUUID(); return uuid.toString(); } /** * get timestamp **/ public static String getISO8601Time() { Date nowDate = new Date(); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); df.setTimeZone(new SimpleTimeZone(0, "GMT")); return df.format(nowDate); } 添加签名。public static String composeUrl(String endpoint, Map<String, String> queries) throws UnsupportedEncodingException { Map<String, String> mapQueries = queries; StringBuilder urlBuilder = new StringBuilder(""); urlBuilder.append("http"); urlBuilder.append("://").append(endpoint); if (-1 == urlBuilder.indexOf("?")) { urlBuilder.append("/?"); } urlBuilder.append(concatQueryString(mapQueries)); return urlBuilder.toString(); } public static String concatQueryString(Map<String, String> parameters) throws UnsupportedEncodingException { if (null == parameters) { return null; } StringBuilder urlBuilder = new StringBuilder(""); for (Map.Entry<String, String> entry : parameters.entrySet()) { String key = (String) entry.getKey(); String val = (String) entry.getValue(); urlBuilder.append(encode(key)); if (val != null) { urlBuilder.append("=").append(encode(val)); } urlBuilder.append("&"); } int strIndex = urlBuilder.length(); if (parameters.size() > 0) { urlBuilder.deleteCharAt(strIndex - 1); } return urlBuilder.toString(); } public static String encode(String value) throws UnsupportedEncodingException { return URLEncoder.encode(value, "UTF-8"); } }

2019-12-01 23:11:55 0 浏览量 回答数 0

回答

外键字段和引用的类型和定义必须相同。这意味着您的外键不允许更改字段的类型。 一种解决方案是: LOCK TABLES favorite_food WRITE, person WRITE; ALTER TABLE favorite_food DROP FOREIGN KEY fk_fav_food_person_id, MODIFY person_id SMALLINT UNSIGNED; 现在您可以更改您的person_id ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT; 重新创建外键 ALTER TABLE favorite_food ADD CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id) REFERENCES person (person_id); UNLOCK TABLES; 编辑: 上面添加了锁,感谢评论 在执行此操作时,您必须禁止写入数据库,否则可能会冒数据完整性问题的风险。 我在上面添加了写锁 除您(INSERT, UPDATE, DELETE)以外的任何其他会话中的所有写作查询将等待超时或UNLOCK TABLES; 被执行 http://dev.mysql.com/doc/refman/5.5/zh-CN/lock-tables.html 编辑2:OP要求对行进行更详细的说明“外键字段和引用的类型和定义必须相等。这意味着您的外键不允许更改字段的类型。” 从MySQL 5.5参考手册:FOREIGN KEY约束 外键和引用键中的对应列在InnoDB中必须具有相似的内部数据类型,以便可以在不进行类型转换的情况下进行比较。整数类型的大小和符号必须相同。字符串类型的长度不必相同。对于非二进制(字符)字符串列,字符集和排序规则必须相同。来源:stack overflow

保持可爱mmm 2020-05-17 20:59:50 0 浏览量 回答数 0

问题

MySQL 数据类型:报错

kun坤 2020-06-20 10:57:10 0 浏览量 回答数 1
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 SSL证书 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站 2020中国云原生 阿里云云栖号