将字符串Filepath转换为唯一标识符

时间:2019-06-05 05:16:58

标签: c++ c++11

将字符串文件路径转换为唯一标识符。

这是我需要转换为唯一ID的文件路径。(首选int)

D:\Images\PSSL\2019\Team_Colours\Base_1\Generic.png
D:\Images\Generic.png
D:\Images\Generic\Images\2019\Base.png

从图像到图像的路径会有所警惕

因为我对如何进行操作有点迷茫而没有张贴任何代码的策略

1 个答案:

答案 0 :(得分:2)

您的字符串不是路径,而是路径,如果相应的文件/目录始终存在,则可以使用其节点号d_ino中的字段struct dirent

注意: dirent 在Linux / Unix / Windows上可用,如果由于编译器而没有,请使用List of all files inside the folder and its subfolders in Windows


如果文件/目录可能不存在,则可以自己创建字典字符串-> int,例如:

#include <iostream>
#include <string>
#include <map>
#include <list>

class UI {
  public:
    UI() : next(1) {}
    unsigned search(std::string) const;
    unsigned get(std::string);
    unsigned forget(std::string);

  private:
    std::map<std::string, unsigned> m;
    std::list<unsigned> free;
    unsigned next;
};

unsigned UI::search(std::string s) const {
  std::map<std::string, unsigned>::const_iterator it = m.find(s);

  return (it == m.end()) ? 0 : it->second;
}

unsigned UI::get(std::string s) {
  std::map<std::string, unsigned>::const_iterator it = m.find(s);

  if (it != m.end())
    return it->second;

  unsigned r;

  if (!free.empty()) {
    r = free.front();
    free.pop_front();
  }
  else
    r = next++;

  m[s] = r;
  return r;
}

unsigned UI::forget(std::string s) {
  std::map<std::string, unsigned>::const_iterator it = m.find(s);

  if (it == m.end())
    return 0;

  unsigned r = it->second;

  m.erase(it);

  if (r == (next - 1))
    next -= 1;
  else
    free.push_back(r);

  return r;
}

int main(void)
{
  UI ui;

  std::cout << "aze " << ui.search("aze") << std::endl;  
  std::cout << "aze " <<  ui.get("aze") << std::endl;
  std::cout << "qsd " <<  ui.get("qsd") << std::endl;
  ui.forget("aze");
  std::cout << "aze " << ui.search("aze") << std::endl;
  std::cout << "wxc " <<  ui.get("wxc") << std::endl;
  return 0;
}

编译和执行:

pi@raspberrypi:/tmp $ g++ -pedantic -Wall -Wextra c.cc
pi@raspberrypi:/tmp $ ./a.out
aze 0
aze 1
qsd 2
aze 0
wxc 1
pi@raspberrypi:/tmp $ 

注意:

  • 我不检查输入新字符串时是否已经使用了 unsigned int 的所有可能的值,否则在这种情况下您会遇到内存问题,或者使用64b未签名以确保;-)

  • 字符串的ID肯定是唯一的,但取决于历史记录,哈希值不取决于历史记录,但几个字符串可能具有相同的哈希值