Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.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
python将字符串哈希到文件中的位置_Python_Hash - Fatal编程技术网

python将字符串哈希到文件中的位置

python将字符串哈希到文件中的位置,python,hash,Python,Hash,是否有一种方法可以使用哈希函数(或类似的方法)在文件中生成唯一的位置,以便我可以轻松地从该位置检索与该字符串对应的某些值: >>> hash('abs') -1600925517 >>> hash('cv') -1537434339 >>> hash(112) 112 >>> hash('ANNC') 258026172 >>> hash('annc') 1415313084 >>> ha

是否有一种方法可以使用哈希函数(或类似的方法)在文件中生成唯一的位置,以便我可以轻松地从该位置检索与该字符串对应的某些值:

>>> hash('abs')
-1600925517
>>> hash('cv')
-1537434339
>>> hash(112)
112
>>> hash('ANNC')
258026172
>>> hash('annc')
1415313084
>>> hash('an')
-1549758577
>>> hash('anc')
-1588925561
>>> hash('abs')
-1600925517
这样的话

def hash_location(string):
   return location

open_file=open(file_path,'r+')
our_string='something'
location=hash_location(our_string)
open_file.seek(location)
open_file.write(our_string)
open_file.close()

因此,散列值可以对应于文件中的某个“正”位置,只要我的平台上的字符串

No-
散列
返回至少64位的数字,我就可以计算该位置,因此,即使您只存储长度为1字节的字符串,您仍然需要2**64=16个字节的磁盘空间

from random import random
from hashlib import sha1

file_ext = ".jpg"
unique_filename = sha1(str(random()).hexdigest() + file_ext
您试图解决的具体问题是什么?也许有更好的方法来实现你的目标

编辑

考虑到您需要存储10M+字符串,我建议如下

使用定义良好的散列算法,如MD5,而不是Python中内置的
hash
函数,该函数可能因平台或实现而异

>>> import hashlib
>>> hashlib.md5('test').hexdigest()
'098f6bcd4621d373cade4e832627b4f6'
然后一次取3个字符形成一个目录结构-这样每个目录最多可包含16*16*16=4096个文件。因此,在上面的示例中,您将使用

/098/f6bcd4621d373cade4e832627b4f6.txt
根据您的字符串长度,将字符串存储在单个文件中可能会因为文件系统存储阻塞而效率低下。因此,在此阶段,您可以在文件中每行存储一个字符串,然后对(非常小的)文件进行搜索,例如:

/908/f6b.txt contains:
cd4621d373cade4e832627b4f6 test
02ab5595859014ebf0951522d9 another string

您可能需要根据您的特定应用程序调整参数,但这似乎是一个很好的起点。

为什么您认为这种方法比使用RGEXE更好?即使没有正则表达式,也可以使用string method
find
在文件中查找字符串,这非常快。伙计们,我说的是非常大的字符串列表(10M+),我想物理存储在文件中,不能使用正则表达式。。。我需要一个函数,我可以给它一个字符串,它会给我一个整数,反映与它相关的唯一位置你可能最好使用gdbm或bsddb。这些是在Python中使用了很长时间的单表数据库。它们的用法非常简单-它们看起来像是一本字典,你可以把字符串放进去。但这实际上会生成一个随机的文件名。。。我希望哈希函数这样的函数每次生成一个对每个字符串唯一的整数,这样我就可以使用它在一个大字符串中定位这个字符串file@hmghaly我认为这里的意图是用实际字符串替换str(random())。但是,如果您声明您有超过10M个字符串,则可能需要使用目录结构。有关详细信息,请参阅我的答案。我有一些类似于10M+的字符串要存储在文件中,我想找到一个类似于hash函数的函数,它可以为每个字符串提供一个uniue整数,我可以用它来定位文件中的字符串,而不必逐行遍历它或将它存储在ram中。你可以使用一个32位的hash函数,这只需要最大字符串长度的每字节4GB,但这会增加冲突的可能性。为什么要重新发明轮子呢?数据库和文件系统可能已经处理了这个问题。我认为dbs是解决这个问题的标准解决方案,但我想知道是否有一种替代方案可以使用这种功能