我很好奇为什么 SHA256 的结果可以保存在 binary(32) 中,但它需要一个 varchar(64) 才能得到相同的结果已保存。
我的意思是,256 位是 32 个字节,因此,保存在 binary(32) 中非常有意义。但是,为什么尝试将其保存在 varchar 中需要每个字节都有一个额外的字节?
最佳答案
让我们从头开始,看看密码函数是什么以及它实际输出的是什么:
A cryptographic hash function is a hash function, that is, an algorithm that takes an arbitrary block of data and returns a fixed-size bit string, the (cryptographic) hash value.
这意味着我们得到了 1 和 0 的序列。为了正确保存该序列,您必须使用 MySQL 的 binary 数据类型列,因为它不保存任何有关如何向用户表示已保存数据的数据 - 没有与它。这意味着当您尝试查看数据时,您很可能会看到乱码,因为 GUI 程序会尝试将存储的值表示为 ASCII 编码字符串(这是错误的)。
我将跳过散列值表示为数字的原因,但重点是它是。而且是十六进制数。让我们以您使用的第一个字节为例:
10101111 = 十进制 175 或十六进制 AF。
当然,您可以将 ASCII 175 表示为某种东西,它很可能是一个奇怪的字符,具体取决于所使用的代码页。 ASCII 的问题是 127 以上的代码是任意的,这会导致发明代码页,这会导致发明 Unicode 等,所以我暂时跳过它。
要点是,您不能依赖 ASCII 在每种情况下都正确显示 10101111。
这意味着 175 必须使用 3 个字节而不是 1 个字节来显示。为什么?因为 175 中的每个字符都必须使用其自己的字节显示。
这意味着您可以将哈希值显示为十进制数。这也意味着您可以将您的号码显示为十六进制数,这明显更短。
让我们再次使用 10101111。
在十进制中,它是 175,需要 3 个字节才能在屏幕上显示它 - 1 个表示 1,1 个表示 7,1 个表示 5。
在十六进制中,它是 AF,需要 2 个字节才能在屏幕上显示 - 明显更短。
转换为十六进制数字时,每个字节至少有 2 位数字(有前导零)。对于十进制数,情况并非如此,因此您知道每次要将 1 个字节表示为十六进制数时 - 您至少有 2 位数字。因此,您的消息是固定宽度的,它使用数字 0-9、字母 A-F,它们在每个 ASCII 代码页中都位于相同的位置,因此它们看起来是一样的。
因此,当您使用 AF 并以 ASCII 显示它时,A 需要 1 个字节,F 需要 1 个字节。
有32个数,每个有2位数字,32x2 = 64字节。
您可能犯的唯一错误是使用 varchar(64)。如果您知道散列宽度,则使用 varchar 存储散列是没有用的。使用 char 会好得多,因为您不会浪费 varchar 列使用的 1 个字节。
希望这能稍微澄清一下。它实际上比听起来更简单:)
关于mysql - SHA256算法结果的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12688502/
在我的Rails(2.3,Ruby1.8.7)应用程序中,我需要将字符串截断到一定长度。该字符串是unicode,在控制台中运行测试时,例如'א'.length,我意识到返回了双倍长度。我想要一个与编码无关的长度,以便对unicode字符串或latin1编码字符串进行相同的截断。我已经了解了Ruby的大部分unicode资料,但仍然有些一头雾水。应该如何解决这个问题? 最佳答案 Rails有一个返回多字节字符的mb_chars方法。试试unicode_string.mb_chars.slice(0,50)
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
在Ruby1.9.3(可能还有更早的版本,不确定)中,我试图弄清楚为什么Ruby的String#split方法会给我某些结果。我得到的结果似乎与我的预期相反。这是一个例子:"abcabc".split("b")#=>["a","ca","c"]"abcabc".split("a")#=>["","bc","bc"]"abcabc".split("c")#=>["ab","ab"]在这里,第一个示例返回的正是我所期望的。但在第二个示例中,我很困惑为什么#split返回零长度字符串作为返回数组的第一个值。这是什么原因呢?这是我所期望的:"abcabc".split("a")#=>["bc"
导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri
我正在使用Ruby,我正在与一个网络端点通信,该端点在发送消息本身之前需要格式化“header”。header中的第一个字段必须是消息长度,它被定义为网络字节顺序中的2二进制字节消息长度。比如我的消息长度是1024。如何将1024表示为二进制双字节? 最佳答案 Ruby(以及Perl和Python等)中字节整理的标准工具是pack和unpack。ruby的packisinArray.您的长度应该是两个字节长,并且按网络字节顺序排列,这听起来像是n格式说明符的工作:n|Integer|16-bitunsigned,network(bi
目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
有没有一种简单的方法可以将给定的整数格式化为具有固定长度和前导零的字符串?#convertnumberstostringsoffixedlength3[1,12,123,1234].map{|e|???}=>["001","012","123","234"]我找到了解决方案,但也许还有更聪明的方法。format('%03d',e)[-3..-1] 最佳答案 如何使用%1000而不是进行字符串操作来获取最后三位数字?[1,12,123,1234].map{|e|format('%03d',e%1000)}更新:根据theTinMan的