python存储数据空间最小_python-存储8M sha256哈希的最有效内存方式

首先,让我们看一下为什么这么大.

每个都有32个字节.这意味着以二进制形式存储在例如字节或字节数组对象的存储中大约需要32个字节.到现在为止还挺好.

但是所有Python对象都有标头,通常为24-64个字节.通过快速检查,看起来字节对象在32位(可能加上对齐填充)上占用了额外的36个字节,在64位上占用了48个字节(至少在我检查的两个CPython版本上).

因此,您如何摆脱那150%的额外存储空间?将字节打包成一个巨型数组,例如字节或字节数组.然后,您总共有48个字节加上每个哈希32个,而不是每个哈希48 32个.当您需要访问散列时,如果您有索引,则它只是切片[index * 32:(index 1)* 32].

另外,根据创建字节的方式,可能会有一些溢出斜率.您可以检查-sys.getsizeof(s)-sys.getsizeof(b”)>镜头,您需要对所有对象进行切片以创建新副本,而无需额外填充.

无论如何,现在您有8M的额外索引.如果这些是瞬态的,那很好,但是如果您将它们作为int存储在dict值槽中,那么它们中的每个也都有一个标头.通过快速测试,在实际存储的4个字节之上(对于小于1≤31的int),在32位和64位中都有一个24字节的标头(尽管非常小的int显然可以塞入标头).因此,所有这些操作将您的48个字节的浪费减少到28个字节,这不是很好.

您可以使用某种形式的打包存储,例如array模块.我的数组类型每个整数仅使用4个字节.但是然后您需要将索引插入数组,这就是您刚解决的相同问题.

但是,您甚至根本不需要索引-如果将密钥本身存储在数组中,则任何密钥的索引已经是字节字符串(除以32)中哈希的索引,对吗?

仅当您可以将密钥存储在某种紧凑数组中时,此方法才有效.如果它们大小都相同,则可以再次使用相同的“ giantbytestring”技巧来实现.在您的情况下,它们就是-密钥也是32字节的哈希.因此,您只需要使两个巨型字节字符串都按键值排序即可(请参见bisect模块,因此您不必自己编写该代码).

当然,使用二进制搜索算法而不是哈希意味着您要进行查找并插入对数而不是常量.而且,虽然log(8M)仅为16左右,比8M好很多,但仍然是1的16倍.但这实际上是从理想调优的关系数据库中获得的结果,除了不需要进行任何调整,并且全部都在内存中,并且没有任何额外的开销,因此必须对您到目前为止进行的尝试进行改进.

您当然可以在Python中使用两个巨型字节数组作为存储,并使用两个array(‘I’)作为索引来构建自定义哈希表.但这还有很多工作要做,所以我首先尝试简单的方法.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
sha256哈希函数是利用Python的hashlib库实现的。可以使用sha256()方法来生成字符串或文件的哈希值。引用中给出了生成字符串和文件哈希值的示例代码。 如果要生成字符串的sha256哈希值,可以使用generate_sha256_hashCode()函数,将需要哈希的字符串作为参数传入。函数内部会对字符串进行编码,并使用sha256算法进行加密,最后返回哈希值。示例代码如下: ```python from hashlib import sha256 def generate_sha256_hashCode(plainText): plainTextBytes = plainText.encode('utf-8') encryptor = sha256() encryptor.update(plainTextBytes) hashCode = encryptor.hexdigest() return hashCode if __name__ == "__main__": print(generate_sha256_hashCode('123')) ``` 如果要生成文件的sha256哈希值,可以使用相似的方法。首先使用open()函数打开文件,并读取文件内容。然后对文件内容进行编码,并使用sha256算法进行加密,最后返回哈希值。示例代码如下: ```python from hashlib import sha256 def generate_sha256_hashCode(filePath): with open(filePath, encoding="utf-8") as f: plainText = f.read() plainTextBytes = plainText.encode('utf-8') encryptor = sha256() encryptor.update(plainTextBytes) hashCode = encryptor.hexdigest() return hashCode if __name__ == "__main__": print(generate_sha256_hashCode('test.txt')) ``` 另外,如果想使用md5算法生成哈希值,可以使用类似的方法。可以先导入hashlib库,然后使用sha256()方法替换为md5()方法即可。引用中给出了使用md5生成哈希值的示例代码。 ```python import hashlib password = 'wotemo666' hash_password = hashlib.md5(password.encode("utf-8")).hexdigest() print(hash_password) ``` 总结来说,sha256哈希函数是通过使用hashlib库中的sha256()方法来实现的,可以生成字符串和文件的哈希值。而md5哈希函数可以使用hashlib库中的md5()方法来实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [【Python】使用Python实现sha256、md5等加密算法生成哈希值](https://blog.csdn.net/aidijava/article/details/127145370)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [用python哈希函数对密码进行加密](https://blog.csdn.net/shr105/article/details/122799672)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值