2012-09-27 41 views
2

我正在編寫一個python程序來查找文件。該文件是由C++程序創建的,其散列文件名爲(std::hash<std::string> hash_fn)。 我知道從哪個字符串創建哈希,但我找不到一個產生相同哈希的python哈希函數(我試過hash(),全部在hashlib)。 作爲一個例子,該字符串python <=> C++跨語言散列

file:///home/ubuntu/Untitled.skp 

應該給哈希:

3133433022 

不幸的是,我沒有在C++程序的控制,只對Python腳本(或最終的Python擴展)。 是否有可能找到或實現與C++使用的相同的散列函數?或者我應該嘗試另一種方法?

+0

C++標準AFAIR未指定確切的散列算法。所以我們需要更多關於您的環境的信息 - 或者空字符串的散列值可能是我們需要的所有信息。 – ch3ka

+0

檢查了這一點:http://effbot.org/zone/python-hash.htm –

+2

你顯示的散列非常簡單,任何兩個字符串開始相同的5個字母將具有相同的散列。 – Dani

回答

2

在大多數情況下,內部散列函數(如C++中的std::hash或 )中的Python哈希函數不是爲外部使用而設計的。當你設計這樣的系統時,嚴格指定使用的散列函數,並且在兩個系統中實現它。

如果它是太晚了這一點,你已經使用std::hash,然後 所有你能做的就是找到它的來源(這取決於 編譯器,可能不可用),回到他們的工程師找到使用的哈希 算法,將其指定爲哈希,並以任何 所需的語言重新實現。 (您需要在您自己的代碼中實現它,因爲 它可能會在您的編譯器的下一版本中發生變化。)

+0

謝謝,正如我所說的那樣是標準哈希,我假設編譯器是GCC。我不知道編譯器使用什麼散列函數,程序的來源在這裏: http://bazaar.launchpad.net/~unity-team/unity/trunk/view/head:/unity-shared/ThumbnailGenerator .cpp –

+0

@FreddiSchiller問題是標準沒有指定使用的實際哈希函數,甚至不需要實現來記錄它。不能保證它不會從編譯器的一個版本更改爲下一個版本。(FWIW:某些舊版本的g ++使用'h [i] = 31 * h [i-1] + c [i]'作爲它們的散列函數;這可能仍然是這種情況。將'c [i]'轉換爲'unsigned char',所以結果會根據是否有符號'char'而有所不同,並取決於'size_t'的大小。) –

+0

我還可以補充說實現任何C++算法取決於無符號整數的行爲在Python中會很痛苦。您可能必須使用長整數,並在每次操作後使用0xFFFFFFFF進行掩碼。 –

1

如果您可以控制C++部分,則可以確保在兩邊都使用相同的哈希算法。或者,您可以始終查看hash_fn的實現,並嘗試在Python中重新實現相同的功能。

否則,可能很難嘗試匹配哈希函數。

2

要兼容,請在雙方使用已知的散列,如SHA-1。 Python有它的內置,如果C++沒有內置,有很多庫。