2015-08-22 54 views
2

以下代碼snippet可以對字符串對象做散列值。我想獲得散列值一個二進制字符串(一個指針和長度)。我知道我可以用指針和長度來形成一個字符串對象,但是僅僅爲此而形成一個字符串會產生額外的開銷。不知道是否可以使用帶有兩個參數的std散列函數:指針和長度。快速訪問散列函數(不使用字符串對象)

謝謝。

#include <iostream> 
#include <functional> 
#include <string> 

int main() 
{ 
    std::string str = "Meet the new boss..."; 
    std::hash<std::string> hash_fn; 
    std::size_t str_hash = hash_fn(str); 

    std::cout << str_hash << '\n'; 
} 
+0

爲保存指針和長度的自定義類專門化std :: hash? –

+0

感謝@RichardHodges的評論,你最終需要調用'std :: hash ()'來獲取散列值嗎? – packetie

+0

@codingFun - 你可能想看看[這個答案的另一個問題](http://stackoverflow.com/a/11639305/597607),看看你多少時間通過不構建一個簡短的'std :: string' - 約1ns。 –

回答

2

我發現這篇文章在堆棧溢出這表明基礎散列函數實際上是在字符串的內部緩衝區的字節數的函數:

What is the default hash function used in C++ std::unordered_map?

但是,而不是風險不確定的行爲由調用標準庫中的內部函數,爲什麼不問「通過創建std::string」會損失多少性能?鑑於你總是可以創建一個這樣的字符串作爲static const(零開銷),我想知道你實際上要保存什麼?

+0

感謝@RichardHodges的鏈接。試過了,我可以直接使用:'std :: _ Hash_impl :: hash(const char *,int size)'。 :-) – packetie

+2

嘎!你可以在今天,但不能保證它可以在所有系統上工作,甚至在下一個版本的庫上也能正常工作。似乎有點知識是一件危險的事情...... –

+0

同意。有一切權衡:-)再次感謝。 – packetie