散列 numpy 对象数组,hashlib 如何看到对象的内容而不仅仅是指针?
Hashing numpy object array, how does hashlib see objects' contents and not just pointers?
我想知道,哈希是怎么来的? np object[] 中的字符串产生预期结果:
>>> hashlib.sha256(np.array(['asdfda'], dtype=object)).hexdigest()
'6cc08fd2542235fe8097c017c20b85350899c81616db8cb59045022663e3cee1'
>>> hashlib.sha256(np.array(['asd'+'fda'], dtype=object)).hexdigest()
'6cc08fd2542235fe8097c017c20b85350899c81616db8cb59045022663e3cee1'
也就是说,散列考虑了存储在数组中的实际对象值,而不仅仅是指针值。 (那些字符串肯定会有不同的指针。)
hashlib
方法似乎接受支持某些 'buffer API' 的对象,因为不这样做会产生 TypeError: object supporting the buffer API required
.
这是否意味着 numpy 的 ndarray 的缓冲区 API 实现不是 return 指针数组,而是某种字符串数组,或者换句话说 hashlib.hash_algorithm
获取那些存储的字符串?
Those strings would definitely have different pointers.
Definitely 是一个非常有力的声明。看看我在 REPL 中测试的结果:
>>> s = 'asdfda'
>>> s2 = 'asd'+'fda'
>>> s is s2
True
然而,
>>> s3 = s[:2] + s[2:]
>>> s is s3
False
>>>
正如预期的那样,哈希值不同:
>>> hashlib.sha256(np.array([s],dtype=object)).hexdigest()
'176c63097ace4b6754acdd8e37b861bbe1e33489f52d6bd8df07983ead23c73e'
>>> hashlib.sha256(np.array([s3],dtype=object)).hexdigest()
'478307a1bfb4bf413c7e538cc4bbe02370072b0968a91155a4a838e68477f62e'
>>>
我想知道,哈希是怎么来的? np object[] 中的字符串产生预期结果:
>>> hashlib.sha256(np.array(['asdfda'], dtype=object)).hexdigest()
'6cc08fd2542235fe8097c017c20b85350899c81616db8cb59045022663e3cee1'
>>> hashlib.sha256(np.array(['asd'+'fda'], dtype=object)).hexdigest()
'6cc08fd2542235fe8097c017c20b85350899c81616db8cb59045022663e3cee1'
也就是说,散列考虑了存储在数组中的实际对象值,而不仅仅是指针值。 (那些字符串肯定会有不同的指针。)
hashlib
方法似乎接受支持某些 'buffer API' 的对象,因为不这样做会产生 TypeError: object supporting the buffer API required
.
这是否意味着 numpy 的 ndarray 的缓冲区 API 实现不是 return 指针数组,而是某种字符串数组,或者换句话说 hashlib.hash_algorithm
获取那些存储的字符串?
Those strings would definitely have different pointers.
Definitely 是一个非常有力的声明。看看我在 REPL 中测试的结果:
>>> s = 'asdfda'
>>> s2 = 'asd'+'fda'
>>> s is s2
True
然而,
>>> s3 = s[:2] + s[2:]
>>> s is s3
False
>>>
正如预期的那样,哈希值不同:
>>> hashlib.sha256(np.array([s],dtype=object)).hexdigest()
'176c63097ace4b6754acdd8e37b861bbe1e33489f52d6bd8df07983ead23c73e'
>>> hashlib.sha256(np.array([s3],dtype=object)).hexdigest()
'478307a1bfb4bf413c7e538cc4bbe02370072b0968a91155a4a838e68477f62e'
>>>